唯一分解定理 poj 1365
Posted HelloWorld!--By-MJY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯一分解定理 poj 1365相关的知识,希望对你有一定的参考价值。
一行代表一个数 x 给你底数和指数
求x-1的唯一分解定理的底数和指数 从大到小输出
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<math.h> using namespace std; #define MAXN 100010 double z[MAXN],x[MAXN]; bool pri[MAXN]; int p[MAXN]; int di[MAXN],zhi[MAXN]; int main() { memset(pri,0,sizeof(pri)); for(int i=2;i<=32768;i++) { if(!pri[i]) for(int j=i*i;j<=32768;j=j+i) pri[j]=1; } int ans=0; for(int i=2;i<=32768;i++) if(!pri[i]) p[ans++]=i; while(scanf("%lf",&z[1])!=EOF) { if(z[1]==0) break; char s; scanf("%lf%c",&x[1],&s); int cnt=2; int cnt1=0; memset(di,0,sizeof(di)); memset(zhi,0,sizeof(zhi)); if(s==‘\n‘) { double a=pow(z[1],x[1]); long long b=(long long) a; b--; for(int i=0;i<ans;i++) { if(b%p[i]==0) { while(b%p[i]==0) { b=b/p[i]; zhi[cnt1]++; } di[cnt1++]=p[i]; } } if(b>1) { di[cnt1]=b; zhi[cnt1++]=1; } for(int i=cnt1-1;i>0;i--) printf("%d %d ",di[i],zhi[i]); printf("%d %d\n",di[0],zhi[0]); } else { double a=pow(z[1],x[1]); while(scanf("%lf%lf%c",&z[cnt],&x[cnt],&s)) { cnt++; if(s==‘\n‘) break; } for(int i=2;i<cnt;i++) { a*=pow(z[i],x[i]); } long long b=(long long) a; b--; for(int i=0;i<ans;i++) { if(b%p[i]==0) { while(b%p[i]==0) { b=b/p[i]; zhi[cnt1]++; } di[cnt1++]=p[i]; } } if(b>1) { di[cnt1]=b; zhi[cnt1++]=1; } for(int i=cnt1-1;i>0;i--) printf("%d %d ",di[i],zhi[i]); printf("%d %d\n",di[0],zhi[0]); } } return 0; }
以上是关于唯一分解定理 poj 1365的主要内容,如果未能解决你的问题,请参考以下文章
POJ - 1845 G - Sumdiv (唯一分解定理)