题意:给出某数的质因数分解结果,求它减一后分解的质因数结果。

题解:模拟。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int mr=40000;
 6 bool notp[mr];
 7 int pr[mr];
 8 int pn;
 9 void getpri()//筛素数
10 {
11     pn=0;
12     memset(notp,0,sizeof(notp));
13     for(int i=2; i<mr; i++)
14     {
15         if(!notp[i])
16         {
17             pr[pn++]=i;
18         }
19         for(int j=0; j<pn && i*pr[j]<mr; j++)
20         {
21             int k=i*pr[j];
22             notp[k]=1;
23             if(i%pr[j]==0)
24             {
25                 break;
26             }
27         }
28     }
29 }
30 int power(int a,int n)
31 {
32     if(n==0)
33         return 1;
34     else if(n==1)
35         return a;
36     else if(n&1)
37         return a*power(a*a,n>>1);
38     else
39         return power(a*a,n>>1);
40 }
41 char s[100000];
42 int main()
43 {
44     getpri();
45     while(gets(s))
46     {
47         if(s[0]=='0')
48             break;
49         int a,b,sum=1,i=0;
50         while(s[i]!='\0')
51         {
52             a=0,b=0;
53             while(s[i]!=' '&&s[i]!='\0')
54             {
55                 a=a*10+(s[i]-'0');
56                 i++;
57             }
58             i++;
59             while(s[i]!=' '&&s[i]!='\0')
60             {
61                 b=b*10+(s[i]-'0');
62                 i++;
63             }
64             sum*=power(a,b);
65             if(s[i]=='\0')
66                 break;
67             i++;
68         }
69         sum--;
70         int stk[40000][2],top=0;
71         for(int i=0;i<pn&&pr[i]<=sum;i++)
72         {
73             if(sum%pr[i]==0)
74             {
75                 b=0;
76                 a=pr[i];
77                 while(sum%a==0)
78                 {
79                     sum/=a;
80                     b++;
81                 }
82                 stk[top][0]=a;
83                 stk[top][1]=b;
84                 top++;
85             }
86         }
87         --top;
88         printf("%d %d",stk[top][0],stk[top][1]);
89         for(--top;top>=0;top--)
90         {
91             printf(" %d %d",stk[top][0],stk[top][1]);
92         }
93         printf("\n");
94     }
95     return 0;
96 }