GDKOI 2024 鸡 题解
Rainbow_qwq · · 题解
通过找规律,发现
据此计算即可。时间复杂度
核心代码:
int n;
modint m;
modint f[maxn];
signed main()
{
n=read(),m=read(),initmod();
f[2]=(m+1)*(m+1);
f[3]=m*m*m/3+m*m*2+m*8/3+1;
f[4]=m*m*m*7/3+m*m*5+m*11/3+1;
f[5]=m*m*m*m*7/12+m*m*m*17/3+m*m*89/12+m*13/3+1;
f[6]=m*m*m*m*25/6+m*m*m*38/3+m*m*71/6+m*16/3+1;
f[7]=m*m*m*m*m*5/6+m*m*m*m*37/3+m*m*m*133/6+m*m*47/3+m*6+1;
For(i,8,n)f[i]=f[i-1]*2+f[i-2]*2*m+f[i-3]*((-m)*2-2)+f[i-4]*((-m)*m-m*2+1)+f[i-5]*m*2+f[i-6]*m*m;
cout<<f[n].x;
return 0;
}
我们不加证明地猜测两个结论:
- 当
n 固定时,答案是一个关于m 的多项式。 - 当
m 固定时,答案序列f_n 存在一个较短的递推式。
首先写一个快一点的指数级暴力,比如对每种差分数组算上下界然后加起来,可以跑出
据此可以 BM 求出
-
m=1$:$(2,2,-4,-2,2,1) -
m=2$:$(2,4,-6,-7,4,4) -
m=3$:$(2,6,-8,-14,6,9)
容易找规律观察出递推式为
那现在问题在于固定
由于第一条结论,可以暴力跑出