1 条题解
-
0
自动搬运
来自洛谷,原作者为

Rainbow_qwq
**搬运于
2025-08-24 22:54:29,当前版本为作者最后更新于2024-01-20 19:53:50,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
通过找规律,发现 满足如下关系式:
$$f(5,m)=\frac{7}{12}m^4 + \frac{17}{3}m^3+\frac{89}{12} m^2+\frac{13}{3}m+1 $$$$f(6,m)=\frac{25}{6}m^4 + \frac{38}{3}m^3+\frac{71}{6} m^2+\frac{16}{3}m+1 $$$$f(7,m)=\frac{5}{6}m^5 + \frac{37}{3}m^4 + \frac{133}{6}m^3+\frac{47}{3} m^2+6m+1 $$$$f(n,m) = 2f(n-1,m)+2m\cdot f(n-2,m)-(2m+2)f(n-3,m)-(m^2+2m-1)f(n-4,m)+2m\cdot f(n-5,m)+m^2f(n-6,m) $$据此计算即可。时间复杂度 ,可以优化到 。
核心代码:
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; }
我们不加证明地猜测两个结论:
- 当 固定时,答案是一个关于 的多项式。
- 当 固定时,答案序列 存在一个较短的递推式。
首先写一个快一点的指数级暴力,比如对每种差分数组算上下界然后加起来,可以跑出 的结果。
据此可以 BM 求出 的所有递推式,发现第二条结论是正确的,而且递推式长度仅为 :
- :
- :
- :
容易
找规律观察出递推式为 。那现在问题在于固定 求出 的值,之后可以使用递推式。
由于第一条结论,可以暴力跑出 的答案,然后插值求出 时 满足的多项式。
- 1
信息
- ID
- 9746
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者