CSUOJ1985: 驱R符

这题一开始以为是卡特兰数,然后就忘记带模板不会写,结果画图找规律发现不是。。

然后各种发现每一次加一个点,与之前的连线是

 加入第4个点时                1          

   5                                  2 2

   6                                  3 4 3

   7                                4 6 6 4

,发现规律 1*1 1*2 2*1 1*3 2*2 3*3 1*4 2*3 3*2 4*1

n^2的复杂度,打表之后文件太大交不了,然后不知道怎么办了。看了几道题之后突然发现可以推线性递推通项公式,每一行可以合并一下。

n*(n-(n-1))+(n-1)*(n-(n-2))+...(n-(n-1))*n=n*(n+n-1+n+...1)-n*(n-1)-(n-1)*(n-2).....1*0,后面剪掉的预处理一下,前面的等差数列求和。

#include<cstdio>
#include<cstring>
#define maxl 50010

long long n;
long long f[maxl],dec[maxl];

int main()
{
	
	for(long long i=1;i<=50000;i++)
		dec[i]=dec[i-1]+i*(i-1);
	for(long long i=4;i<=50000;i++)
	{
		n=i-3;	
		f[i]=f[i-1]+(n+1)*n/2*n-dec[n];
	}
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%lld",&n);
		printf("%lld\n",f[n]);
	}
	return 0;
}



其实还有更简单的想法,因为每4个点,交叉对角线得到一个交点,所以答案等于C(n,4)

                        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值