这题一开始以为是卡特兰数,然后就忘记带模板不会写,结果画图找规律发现不是。。
然后各种发现每一次加一个点,与之前的连线是
加入第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)