1 #include<cstdio> 2 #include<iostream> 3 #define M 10005 4 int a[M],n,d[M],f[M],b[M],tot,m; 5 void jia(int a1) 6 { 7 for(int i=1;i<=d[0];i++) 8 for(;a1%d[i]==0;) 9 { 10 b[i]++; 11 a1/=d[i]; 12 } 13 return; 14 } 15 void jian(int a1) 16 { 17 for(int i=1;i<=d[0];i++) 18 for(;a1%d[i]==0;) 19 { 20 b[i]--; 21 a1/=d[i]; 22 } 23 return; 24 } 25 void cheng(int a1) 26 { 27 for(int i=1;i<=a[0];i++) 28 a[i]*=d[a1]; 29 for(int i=1;i<=a[0];i++) 30 { 31 a[i+1]+=a[i]/10; 32 a[i]%=10; 33 } 34 for(;a[a[0]+1];) 35 { 36 a[0]++; 37 a[a[0]+1]=a[a[0]]/10; 38 a[a[0]]%=10; 39 } 40 } 41 int main() 42 { 43 scanf("%d",&n); 44 for(int i=2;i<=n;i++) 45 if(!f[i]) 46 for(int j=2*i;j<=n;j+=i) 47 f[j]=1; 48 for(int i=2;i<=n;i++) 49 if(!f[i]) 50 { 51 d[0]++; 52 d[d[0]]=i; 53 } 54 for(int i=2;i<=n-2;i++) 55 jia(i); 56 for(int i=1;i<=n;i++) 57 { 58 int a1; 59 scanf("%d",&a1); 60 if(a1==-1) 61 m++; 62 else 63 { 64 for(int j=1;j<a1;j++) 65 jian(j); 66 tot+=a1-1; 67 } 68 } 69 for(int i=1;i<=n-2-tot;i++) 70 { 71 jia(m); 72 jian(i); 73 } 74 a[0]=1; 75 a[1]=1; 76 for(int i=1;i<=d[0];i++) 77 for(;b[i]>0;b[i]--) 78 cheng(i); 79 for(int i=a[0];i;i--) 80 printf("%d",a[i]); 81 return 0; 82 }
该题运用到了树的prufer编码,然后一个复杂的数学式子化简。http://www.cnblogs.com/noip/archive/2013/03/10/2952520.html