博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 - P2181 - 对角线 - 打表 - 组合数学
阅读量:5126 次
发布时间:2019-06-13

本文共 1849 字,大约阅读时间需要 6 分钟。

对于某条对角线,除去从两端出发的对角线,其他的都与它有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
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=0n=4  ans=1n=5  ans=5n=6  ans=15n=7  ans=35n=8  ans=70n=9  ans=126n=10  ans=210n=11  ans=330n=12  ans=495n=13  ans=715n=14  ans=1001n=15  ans=1365n=16  ans=1820n=17  ans=2380n=18  ans=3060n=19  ans=3876n=20  ans=4845

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

#include
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

你可能感兴趣的文章
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
待整理
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
hihocoder1187 Divisors
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
前端监控
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>