https://www.luogu.org/problemnew/show/P2181

对于某条对角线,除去从两端出发的对角线,其他的都与它有1个交点。

每个点有(n-3)条对角线,每条对角线和其余C(n-2,2)条对角线都有1个交点,共有n个点,重复计算交点再除以2,重复计算直线再除以2。

即n(n-3)/2条对角线,每条对角线和(n-2)(n-3)/2条对角线都有1个交点,重复计算交点再除以2。(错了,并非所有对角线都相交


画图手数,按规律数的话,发现n=4,1个交点;n=5,5个交点=sum(1,2)+2sum(1,1);n=6,15个交点=sum(1,3)+2sum(1,2)+3sum(1,1);n=7,35个交点=sum(1,4)+2sum(1,3)+3sum(1,2)+4sum(1,1)。

所以我们首先得到一个n复杂度的解法。利用这个解法打表看看。

#include<bits/stdc++.h>
using namespace std;
#define ll long longll sum(ll a1,ll an){return (an-a1+1)*(a1+an)/2;
}int main(){for(int n=3;n<=20;n++){ll ans=0;for(int i=1;i<=n-3;i++){ans+=1ll*i*sum(1,n-2-i);}printf("n=%d  ans=%lld\n",n,ans);}}

n=3  ans=0
n=4  ans=1
n=5  ans=5
n=6  ans=15
n=7  ans=35
n=8  ans=70
n=9  ans=126
n=10  ans=210
n=11  ans=330
n=12  ans=495
n=13  ans=715
n=14  ans=1001
n=15  ans=1365
n=16  ans=1820
n=17  ans=2380
n=18  ans=3060
n=19  ans=3876
n=20  ans=4845

再试试大点的会不会爆,结果看不太出来,用ull和ll的结果没啥不同,赌他不溢出。

#include<bits/stdc++.h>
using namespace std;
#define ll long longunsigned ll sum(ll a1,ll an){return (an-a1+1)*(a1+an)/2;
}int main(){int n;scanf("%d",&n);//for(int n=99999;n<=100000;n++){unsigned ll ans=0;for(int i=1;i<=n-3;i++){ans+=1llu*i*sum(1,n-2-i);}//printf("n=%d  ans=%llu\n",n,ans);printf("%llu\n",ans);//}

}

事实证明是没有溢出。所以上面是正确的解法。

这道题还有用公式的解法,降低了一个维度。除了用组合数学的知识直接得到(4个不同的点确定一个交点,直接C(n,4)),还可以暴力求解,这里介绍一下高阶差分。

首先我们由打表代码得到

0 1 5 15 35 70 126

一阶差分

1 4 10 20 35 56

二阶差分

3 6 10 15 21

三阶差分

3 4 5 6

四阶差分

1 1 1

五阶差分

0 0

所以上式是一个关于n的四次多项式。设为an^4+bn^3+cn^2+dn+e=0。

代入前5项强行算出来吧。还是说有别的计算方法?

的确有!(差分数列只要得到等差数列即可)

写出差分表之后,差分表的每行第0项组成第0对角线,即c0,c1,c2,c3,0,0,0...。原序列的通项满足

hn=c0C(n,0)+c1C(n,1)+c2C(n,2)+c3C(n,3),利用这个形式甚至可以求出前n项和。(组合数的求和sum(k=0~n,C(k,p))=C(k+1,p+1))


参考https://blog.csdn.net/wu_tongtong/article/details/79115921

转载于:https://www.cnblogs.com/Yinku/p/10328616.html

洛谷 - P2181 - 对角线 - 打表 - 组合数学相关推荐

  1. 洛谷P2181答案C语言,洛谷P2181 对角线(组合数)

    题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. 输出格式: 第一行输出交点数 ...

  2. 洛谷 P2181 对角线

    P2181 对角线 传送门 题目描述 对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点.请求出图形中对角线交点的个数. 例如,6 边形: 输入格式 输入只有一行一个整数 n,代表边数. ...

  3. 洛谷P2181 对角线

    一般我们见到这种多边形可以认定为n边形,我们可以知道n边形的对角线是n(n-3)/2,因此我们可以推断中间交点的数量,如:四边形对角线交点为 1个:五边形对角线交点为5个:六边形对角线为15个等等所以 ...

  4. 洛谷P2181 对角线(c语言)

    第三篇题解 题目描述 对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点.请求出图形中对角线交点的个数. 例如,6 边形: 输入格式 输入只有一行一个整数 nn,代表边数. 输出格式 输 ...

  5. 洛谷P2181对角线题解(C语言)

    题目描述 对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点.请求出图形中对角线交点的个数. 例如,6 边形: 输入格式 输入只有一行一个整数n,代表边数. 输出格式 输出一行一个整数代 ...

  6. 洛谷P2181——对角线

    P2181 对角线 原题传送 题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. ...

  7. 洛谷 P2181对角线——排列组合

    P2181看到的时候觉得思考难度极大,想要利用图论求解,但没有思路,最后从答案中明白,核心是排列组合,三条对角线不会交于一点,所以任何一点都必须由两条对角线组成--即四个点确定一个交点. 也就是问,顶 ...

  8. 洛谷P2181 对角线(组合数)

    题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. 输出格式: 第一行输出交点数 ...

  9. 洛谷 P2181 对角线(C语言)

    题目描述 对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点.请求出图形中对角线交点的个数. 例如,6 边形: 输入格式 输入只有一行一个整数 n,代表边数. 输出格式 输出一行一个整数 ...

最新文章

  1. Beaglebone Black教程项目1闪烁板载LED
  2. linux查找日期目录,详解Linux查找目录下的按时间过滤的文件
  3. HDU - 6899 Xor(数位dp)
  4. ASP.NETmvc常用JQUERY收藏【jquery.form.js结合jquery.validate.js】
  5. 你真的了解低代码平台吗?
  6. Bing Speech Recognition 标记
  7. STL(七)——队列queue优先队列priority_queue
  8. Python 机器学习 随机森林 天气最高温度预测任务(三)
  9. 如何选择数据可视化工具?
  10. 什么是Csrss.exe进程?此进程有何作用?
  11. 用QT做串口通讯,读取身份证信息
  12. HYSBZ 2565 Manacher算法
  13. CFile用法与实现
  14. 如何登录锐捷设备(网关篇)
  15. python爬取微信好友_如何用 Python 爬取自己的微信朋友
  16. 数据仓库中各个常用英文简写的代表意义
  17. java中输入字符串并输入每个汉字的ASC码
  18. 银河麒麟操作系统如何开启kdump
  19. 05. JavaMail 回复邮件
  20. 验证字符串首尾不允许输入空格,中间只能输入一个空格

热门文章

  1. linux mysql5.6.27源码安装和错误解决
  2. StatusCodeError: 400 - “{\“code\“:40000,\“error\“:\“错误 Error: 登录用户不是该小程序的开发者
  3. CSS之media query模板
  4. 移动端禁止视频自动全屏播放
  5. 数据结构算法入门--链表
  6. 远程上传下载文件-Xftp5
  7. session 的 源码
  8. HDU1232——通畅工程(并查集)
  9. Shallow Copy Deep Copy in Python list
  10. SharePoint【学习笔记】-- SharePoint 2010 技术参数整理