题意:
给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; i<sscnt; i++) { if((ll)ss[i]>sum) 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; }
时间: 2024-10-20 12:04:44