1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,tot,root,ans,MOD=10007,head[210],big[210],size[210],f[210][210],temp[210]; struct ppap { int to,nxt; }e[410]; void add(int u,int v) { e[++tot].nxt=head[u],e[tot].to=v,head[u]=tot; } void getroot(int x,int fa) { size[x]=1,big[x]=0; for(int i=head[x];i;i=e[i].nxt) if(e[i].to!=fa) getroot(e[i].to,x),size[x]+=size[e[i].to],big[x]=max(big[x],size[e[i].to]); big[x]=max(big[x],n-size[x]); if(big[x]<=big[root]||(!root)) root=x; } void dfs(int x,int fa) { size[x]=f[x][0]=f[x][1]=1; for(int i=head[x];i;i=e[i].nxt) if(e[i].to!=fa){ dfs(e[i].to,x); for(int j=1;j<=size[x]+size[e[i].to];j++) temp[j]=0; for(int j=1;j<=size[x];j++) for(int k=0;k<=size[e[i].to];k++) temp[j+k]=(temp[j+k]+f[x][j]*f[e[i].to][k]%MOD)%MOD; size[x]+=size[e[i].to]; for(int j=1;j<=size[x];j++) f[x][j]=temp[j]; } } void solve1(int x) { memset(f,0,sizeof(f)); dfs(x,0); for(int i=1;i<=n;i++){ memset(f[x],0,sizeof(f[x])),size[x]=f[x][0]=f[x][1]=1; for(int j=head[x];j;j=e[j].nxt){ for(int k=1;k<=size[x]+size[e[j].to];k++) temp[k]=0; for(int k=1;k<=size[x];k++) for(int l=0;l<=size[e[j].to];l++){ if(l*2>=i) break; temp[k+l]=(temp[k+l]+f[x][k]*f[e[j].to][l]%MOD)%MOD; } size[x]+=size[e[j].to]; for(int k=1;k<=size[x];k++) f[x][k]=temp[k]; } ans=(ans+f[x][i])%MOD; } } void solve2(int x,int y) { memset(f,0,sizeof(f)); dfs(x,y),dfs(y,x); for(int i=1;i<=n;i++) ans=(ans+f[x][i]*f[y][i]%MOD)%MOD; } int main() { int test=0,T; scanf("%d",&T); while(T--){ test++,memset(head,0,sizeof(head)),tot=ans=0; scanf("%d",&n); for(int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x); root=0,getroot(1,0); if(big[root]*2<n) solve1(root); else{ int y; for(int i=head[root];i>0;i=e[i].nxt){ y=e[i].to; if(big[root]==size[y]) break; } solve2(root,y); } printf("Case %d: %d\n",test,ans); } }
|