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

posted on 2016-02-27 22:29  xiyuedong  阅读(155)  评论(0编辑  收藏  举报