题意:给出某数的质因数分解结果,求它减一后分解的质因数结果。
题解:模拟。
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 }