[BZOJ1211]树的计数(前方大波吐槽,慎入)
树的计数
题目描述
输入格式
输出格式
样例
本来这题没什么可说的,就是个基础结论,然而,我目前非常的不爽,一道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 }
目前在写明明的烦恼,一个特判都不敢扔。。。