跳到主要内容

Mod i

· 阅读需 1 分钟

考虑本题暴力,易得转移方程

令f[j][i]f[j][i]表示到第jj个位置最多分割为ii个组所有的方案数

f[j][i]=∑k=jnf[j][i−1],sum[k]−sum[j]≡0(modi)f[j][i]=\sum_{k=j}^n f[j][i-1],sum[k]-sum[j]\equiv 0\pmod i

就可以很快的得到一个O(n3)O(n^3)的代码,实现好的话可以得到32pts32pts

考虑优化,我们可以将式子sum[k]−sum[j]≡0(modi)sum[k]-sum[j]\equiv 0\pmod i改写为sum[k]≡sum[j](modi)sum[k]\equiv sum[j]\pmod i

所以建立一个桶visvis,记录所有同余系的∑f[x][i−1]\sum f[x][i-1],考虑f[j][i]f[j][i]的转移时就只需要加上vis[sum[j]%i]vis[sum[j]\%i]就可以了

时间复杂度O(n2)O(n^2),可以通过本题

for( int i=2;i<=n;i++ )
{
memset( vis,0,sizeof( vis ) );
for( int j=1;j<=n;j++ )
{
( f[j][i]+=vis[sum[j]%i] )%=mod;
( vis[sum[j]%i]+=f[j][i-1] )%=mod;
}
}