AGC022F Checkers
Tags: Tree,dp,计数
不是,为什么这么抽象的题赛时过的人比 D 多啊??
对着某篇错的题解瞪了一天,真服了。
考虑转化题意。我们令一次
由于对称操作形如
考虑根据这棵树求出最后点所在的位置,设
在实际过程中,我们一定是以从叶子逐步向上的顺序进行操作,一个点只有在所有叶子都操作完的情况下才能被操作。而考虑一次操作对树上每个点贡献的改变,
那么点
进一步地,设点
性质足够了,考虑 dp。从上到下一层层给这棵树填节点,设
枚举这一层的节点数
枚举
故有转移:
时间复杂度
#define int long long
const int N=105,mod=1e9+7;
int n,c[N][N],f[N][N];
il void init(int mx)
{
for(int i=0;i<=mx;i++)
for(int j=0;j<=i;j++) c[i][j]=j?(c[i-1][j-1]+c[i-1][j])%mod:1;
}
il void add(int &x,int y) {x=(x+y)%mod;}
signed main()
{
n=read(); init(n);
f[1][0]=f[1][1]=n;
for(int i=1;i<=n;i++)
for(int j=0;j<=i;j++)
{
if(!f[i][j]) continue;
for(int k=j?j:2;k<=n-i;k+=2)
{
int t=(k-j)>>1;
for(int p=0;p<=k;p++) add(f[i+k][abs(p-t)],f[i][j]*c[n-i][k]%mod*c[k][p]);
}
}
printf("%lld\n",f[n][0]);
return 0;
}