2 9 2 1 3 1 4 3 5 3 6 2 7 4 8 7 9 3 8 2 1 3 1 4 3 5 1 6 4 7 5 8 4
Case #1: 32 Case #2: 16
显然,如果有大于2个非叶子节点肯定无解,
l1叶子节点可以全排列l1!
如果有一个非叶子节点,可能在两端,答案*2
如果有两个非叶子节点,必然各在一端,答案*2
最后由于当前根节点要么在首要么在尾答案*2,但由于这2种情况在父节点的时候才被决定,所以不用管
#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=Next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (1000000007) #define MAXN (200000+10) #define MAXM (200000+10) typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int n; int pre[MAXN],Next[MAXM],edge[MAXM],siz=1; void addedge(int u,int v) { edge[++siz]=v; Next[siz]=pre[u]; pre[u]=siz; } void addedge2(int u,int v){addedge(u,v),addedge(v,u);} int sz[MAXN]; ll jie[MAXN]; void init(){ jie[0]=1; For(i,200000) jie[i]=(jie[i-1]*i)%F; } ll dfs(int x,int fa) { int l1=0,l2=0; ll ans=1; Forp(x) { int v=edge[p]; if (v==fa) continue; ans=mul(ans,dfs(v,x)); sz[x]+=sz[v]; if (sz[v]==1) l1++;else l2++; } sz[x]++; if (l2>2) { return 0; } if (l1+l2==0) return 1; if (l2==0) return ans=mul(ans,mul(jie[l1],1)); if (l2==1) return ans=mul(ans,mul(jie[l1],2)); if (l2==2) return ans=mul(ans,mul(jie[l1],2)); } int main() { // freopen("K.in","r",stdin); init(); int T;cin>>T; For(kcase,T) { MEM(pre) MEM(Next) MEM(edge) siz=1; MEM(sz) scanf("%d",&n); For(i,n-1) { int a,b; scanf("%d%d",&a,&b); addedge2(a,b); } if (n==1) { printf("Case #%d: 1\n",kcase); continue; } printf("Case #%d: %I64d\n",kcase,mul(dfs(1,0),2)); } return 0; }