@ysner
2018-07-31T22:26:59.000000Z
字数 1292
阅读 2149
总结
计数
DP
给出,求满足且互不相同的的数量.
排个序,可以统计答案,。
给定个点的树,将树边染成种颜色,使得任意⻓度为或的路径树边颜色不同,求方案数。
,各一遍,统计答案时除去已统计边的颜色:
const int N=1e3+100,mod=1e9+9;
struct Edge{int to,nxt;}e[N<<1];
int n,k,h[N],cnt,son[N],f[N],num[N],Q[N],hd,tl,d[N],ysn;
ll ans=1;
il void add(re int u,re int v){e[++cnt]=(Edge){v,h[u]};h[u]=cnt;}
il void dfs1(re int u,re int fa)
{
f[u]=fa;d[u]=d[fa]+1;
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==fa) continue;
son[u]++;
dfs1(v,u);
}
}
il void bfs()
{
Q[++tl]=1;
while(hd<tl)
{
re int u=Q[++hd],pzy;
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==f[u]) continue;
ans=ans*(k-num[d[v]]-son[f[u]]-(f[f[u]]>0))%mod;num[d[v]]++;
Q[++tl]=v;pzy=d[v];
}
num[pzy]=0;
}
}
int main()
{
re int T;scanf("%d",&T);
while((++ysn)<=T)
{
memset(h,-1,sizeof(h));cnt=0;memset(son,0,sizeof(son));memset(num,0,sizeof(num));hd=tl=0;ans=1;
scanf("%d%d",&n,&k);
fp(i,1,n-1)
{
re int u,v;scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs1(1,0);
bfs();
printf("Case #%d: %lld\n",ysn,ans);
}
return 0;
}
难度极大,而且没题解。
⻓度为元素在中的数列是好的,当且仅当存在⻓度为的无重子串。给出数列,求所有好的数列中的出现次数之和。
有时间再做。
已完成。