2022牛客五一集训派对day1
G Counting regions
题意:正的奇数边形端点两两相连,问,最后分割出多少区域,结果对1000000007取模
个人思路:利用画图工具先弄出几个样例,然后根据样例归纳总结,然后推导出公式
归纳总结得:
ans=ai*xi+1
xi是输入,i是序号
a1=2
d1=5
dd1=5
di=di-1+ddi-1
ai=ai-1+di-1
由:
an=an-1+dn-1
an-1=an-2+dn-2
a2=a1+d1
推得:
an=a1+
∑
i
=
1
n
−
1
d
i
\sum_{i=1}^{n-1} d_i
∑i=1n−1di
同理可得:
dn=d1+
∑
i
=
1
n
−
1
d
d
i
\sum_{i=1}^{n-1} dd_i
∑i=1n−1ddi
整理得:
dn=
∑
i
=
1
n
d
d
i
\sum_{i=1}^{n} dd_i
∑i=1nddi=m2+2*m+2
故:
an=a1+
∑
i
=
1
n
−
1
(
i
2
+
2
∗
i
+
2
)
\sum_{i=1}^{n-1} (i^2+2*i+2)
∑i=1n−1(i2+2∗i+2)
由平方和公式和等差求和公式得:
an=2+n*(n-1)*(2*n-1)/6+(n-1)*n+2(n-1)
平方和公式:
12+22+32+…+n2=n*(n+1)*(2*n+1)/6
因为平方和公式涉及除法,题中又要取模
所以要用到逆元
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e5+10,INF=0x3f3f3f3f,MOD=1000000007;
LL ksm(LL a,LL b){
LL sum=1;
while(b){
if(b&1)
sum=(sum*a)%MOD;
b/=2;
a=(a*a)%MOD;
}
return sum;
}
LL ny(int n){
return ksm(n,MOD-2);
}
int main(){
LL n,m,t;
scanf("%lld",&n);
if(n==3){
printf("1\n");
return 0;
}
m=(n-3)/2;
LL tmp=(2+(m-1)*m%MOD*(2*m-1)%MOD*ny(6)%MOD+m*(m-1)%MOD+2*(m-1)%MOD)%MOD;
printf("%lld\n",(tmp*n+1)%MOD);
return 0;
}