[BZOJ1211]树的计数(前方大波吐槽,慎入)

树的计数

题目描述

一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。

输入格式

第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。

输出格式

输出满足条件的树有多少棵。

样例

样例输入

4 
2 1 2 1

样例输出

2

本来这题没什么可说的,就是个基础结论,然而,我目前非常的不爽,一道HNOI的题,全靠特判?变态不变态

现在难受的一匹,一道分解质因数的板子题(?)让我打了一个小时,非常不爽,特判判出来50分?一个n=1,du[1]=0就让我从WA83蹦到AC,这题A的一点都不让人开心

关于题,没啥想说的,Pufer结论,判一下能不能成树balabala一堆,打个分解质因数的模板,然后你就可以愉快的AC了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #define ll long long
 5 #define maxn 160
 6 using namespace std;
 7 int n,cnt,pp;
 8 ll ans=1,sum;
 9 int du[maxn],visit[maxn],pd[maxn],zs[maxn],jl[maxn];
10 vector <int> cs;
11 void shai(int x)
12 {
13     for(int i=2;i<=x;++i)
14     {
15         if(visit[i]==0)  {visit[i]=i;  zs[++cnt]=i;}
16         for(int j=1;j<=cnt;++j)
17         {
18             if(zs[j]>visit[i]||zs[j]*i>x)  break;
19             visit[i*zs[j]]=zs[j];
20         }
21     }
22 }
23 int main()
24 {
25     scanf("%d",&n);  shai(n);
26     for(int i=1;i<=n;++i)
27     {
28         scanf("%d",&du[i]);  sum+=1ll*du[i];
29         if(du[i]==0)  pp=1;
30     }
31     if(n==1&&du[1]==0)  {printf("1\n");  return 0;}
32     if(sum!=n*2-2)  {printf("0\n");  return 0;}
33     if(pp==1)  {printf("0\n");  return 0;}
34     for(int i=2;i<=n-2;++i)
35     {
36         int ls=i;
37         while(ls>1)
38         {
39             jl[visit[ls]]++;
40             if(pd[visit[ls]]==0)  {pd[visit[ls]]=1;  cs.push_back(visit[ls]);}
41             ls/=visit[ls];
42         }
43     }
44     for(int i=1;i<=n;++i)
45         for(int j=2;j<=du[i]-1;++j)
46         {
47             int ls=j;
48             while(ls>1)
49             {
50                 jl[visit[ls]]--;
51                 if(pd[visit[ls]]==0)  {pd[visit[ls]]=1;  cs.push_back(visit[ls]);}
52                 ls/=visit[ls];
53             }
54         }
55     for(int i=0;i<cs.size();++i)
56         for(int j=1;j<=jl[cs[i]];++j)  {ll ch=1ll*cs[i];  ans=ans*ch;}
57     printf("%lld\n",ans);
58     return 0;
59 }
让人难受的代码

 目前在写明明的烦恼,一个特判都不敢扔。。。

posted @ 2019-07-23 20:41  hzoi_X&R  阅读(204)  评论(0编辑  收藏  举报