@ysner
2018-07-31T14:26:59.000000Z
字数 1292
阅读 2730
总结 计数 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;}
难度极大,而且没题解。
⻓度为元素在中的数列是好的,当且仅当存在⻓度为的无重子串。给出数列,求所有好的数列中的出现次数之和。
有时间再做。
已完成。
