[水+整数分解] poj 1365 Prime Land

题意:

给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 -999999999999999999LLusing namespace std;char v[123456];#define MAXN 100007bool 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;}

,出门走好路,出口说好话,出手做好事。

[水+整数分解] poj 1365 Prime Land

相关文章:

你感兴趣的文章:

标签云: