题解:P8340 [AHOI2022] 山河重整
WrongAnswer_90 · · 题解
My Blogs
P8340 [AHOI2022] 山河重整
题目限制是,对于一种选法
考虑优化,首先两维的状态就爆了。进行容斥,
考虑如何求
再考虑
这个不太好算,我们把所有的
注意到上面的转移天然可以对最小值进行限制。仍然是从大到小枚举宽度,假设枚举到宽度为
int n,MOD;
int g[500010],f[500010],h[500010];
const int B=999;
inline void solve(int n)
{
for(int i=0;i<=n;++i)h[i]=0;
for(int i=B;i>=1;--i)
{
for(int j=0;j+i*(j+1)<=n;++j)
Madd(h[j+i*(j+1)],f[j]);
for(int j=n;j>=i;--j)h[j]=h[j-i];
for(int j=0;j<i;++j)h[j]=0;
for(int j=i;j<=n;++j)Madd(h[j],h[j-i]);
}
for(int i=n/2+1;i<=n;++i)f[i]=Cdel(g[i],h[i]);
}
inline void mian()
{
read(n,MOD);
g[0]=1;
for(int i=B;i>=1;--i)
{
for(int j=n;j>=i;--j)g[j]=g[j-i];
for(int j=0;j<i;++j)g[j]=0;
Madd(g[i],1);
for(int j=i;j<=n;++j)Madd(g[j],g[j-i]);
}
int m=2;
f[0]=f[1]=1;
while(m<n)solve(m),m<<=1;
solve(n);
int ans=power(2,n);
for(int i=0;i<n;++i)Mdel(ans,Cmul(f[i],power(2,n-i-1)));
write(ans,'\n');
}