标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 3211 | Accepted: 1473 |
Description
Input
Output
Sample Input
17 1 5 1 2 1 509 1 59 1 0
Sample Output
2 4 3 2 13 1 11 1 7 1 5 1 3 1 2 1
Source
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define ll long long #define N 100000 ll tot; bool isprime[N+10]; ll prime[N+10]; //1~tot-1 void getprime() //复杂度:O(n) { tot=0; memset(isprime,true,sizeof(isprime)); isprime[0]=isprime[1]=false; for(ll i=2;i<=N;i++) { if(isprime[i]) prime[tot++]=i; for(ll j=0;j<tot;j++) { if(i*prime[j]>N) break; isprime[i*prime[j]]=false; if(i%prime[j]==0) { break; } } } } ll fatcnt; ll factor[N][2]; //0~fatcnt-1 ll getfactors(ll x) //x>1 { fatcnt=0; ll tmp=x; for(ll i=0;prime[i]<=tmp/prime[i];i++) { factor[fatcnt][1]=0; if(tmp%prime[i]==0) { factor[fatcnt][0]=prime[i]; while(tmp%prime[i]==0) { factor[fatcnt][1]++; tmp/=prime[i]; } fatcnt++; } } if(tmp!=1) { factor[fatcnt][0]=tmp; factor[fatcnt++][1]=1; } return fatcnt; } ll pow(ll a,ll b) { ll ret=1; while(b) { if(b&1) ret*=a; a=a*a; b>>=1; } return ret; } int main() { getprime(); ll num,a,b,i; char op; while(scanf("%lld",&a),a) { scanf("%lld%c",&b,&op); num=pow(a,b); if(op!=‘\n‘) { while(scanf("%lld%lld%c",&a,&b,&op)) { num*=pow(a,b); if(op==‘\n‘) break; } } getfactors(num-1); for(i=fatcnt-1;i>0;i--) printf("%lld %lld ",factor[i][0],factor[i][1]); printf("%lld %lld\n",factor[i][0],factor[i][1]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/hate13/p/4431259.html