題意:
給2*n個數,輸入的這些數構成 sum=(a[1]^b[1])*(a[2]^b[2])...
其實就是整數分解完的數。
然後讓你輸出分解sum-1的結果。
從大到小。
思路:
就是輸入麻煩點。
注意題目說了1的時候要輸出空行。
代碼:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"iostream" #include"map" #include"stack" #include"vector" #define ll __int64 #define inf -999999999999999999LL using namespace std; char v[123456]; #define MAXN 100007 bool mark[MAXN]; int ss[MAXN/3],sscnt; int ans1[MAXN/3],ans2[MAXN/3]; void ssb() { sscnt=0; memset(mark,false,sizeof(mark)); mark[0]=mark[1]=true; for(int i=2; i<=MAXN; i++) { if(!mark[i]) { for(int j=i+i; j<=MAXN; j+=i) mark[j]=true; ss[sscnt++]=i; } } return ; } int main() { ssb(); while(gets(v),strcmp(v,"0")) { int f=0,i=0; ll a=0,b=0; ll sum=1; while(v[i]) { if(v[i]>='0' && v[i]<='9') { while(v[i]>='0' && v[i]<='9') { if(!f) a=a*10+v[i]-'0'; else b=b*10+v[i]-'0'; i++; } if(f==1) { sum*=(ll)(pow(a*1.0,b*1.0)+0.0000001); a=0; b=0; } f^=1; } else i++; } sum--; int kx=0; for(int i=0; isum) break; if(sum%ss[i]==0) { int tep=0; while(sum%ss[i]==0) { tep++; sum/=ss[i]; } ans1[kx]=i; ans2[kx++]=tep; } } if(kx==0) { puts(""); continue; } for(int i=kx-1;i>=0;i--) { printf(i==0?"%d %d\n":"%d %d ",ss[ans1[i]],ans2[i]); } } return 0; }