原题走这里
从数据范围可以看出是矩阵快速幂优化
由于这种插头DP各行之间的转移是十(yi)分(mu)相(yi)似(yang)的。
我们可以用矩阵来描述d[i][m][1…S]到d[i+1][m][1…S]的转移。
算出每一个d[i][m][1…S]对每一个d[i+1][m][1…S]的贡献,储存在矩阵里。
做一次矩阵乘法就相当于完成了一行的转移,快速幂即可。
但是最后一步由于插头dp最后一格有特殊转移,矩阵快速幂只能做到m-1行,所以最后一行要特殊处理。
就是这样,感觉好玄学啊
代码如下:
#include <bits/stdc++.h>
#define LL long long
#define MOD 1000000007
using namespace std;
LL n,m,H[2500],s,S,d[2][2500];//S横截线的状态数
map<LL,LL> IH;
struct Matrix
{
LL a[25][25];
inline friend Matrix operator*(const Matrix &m1,const Matrix &m2)
{
Matrix m3;
for(int i=0;i<S;i++)
{
for(int j=0;j<S;j++)
{
for(int k=0;k<S;k++)
{
(m3.a[i][j]+=m1.a[i][k]*m2.a[k][j])%=MOD;
}
}
}
return m3;
}
Matrix()
{
mem