唯一分解定理 poj 1365

时间:2023-03-09 20:12:46
唯一分解定理 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,,sizeof(pri)); for(int i=;i<=;i++)
{
if(!pri[i])
for(int j=i*i;j<=;j=j+i)
pri[j]=;
}
int ans=;
for(int i=;i<=;i++)
if(!pri[i])
p[ans++]=i; while(scanf("%lf",&z[])!=EOF)
{
if(z[]==)
break;
char s;
scanf("%lf%c",&x[],&s);
int cnt=;
int cnt1=;
memset(di,,sizeof(di));
memset(zhi,,sizeof(zhi)); if(s=='\n')
{
double a=pow(z[],x[]);
long long b=(long long) a;
b--; for(int i=;i<ans;i++)
{
if(b%p[i]==)
{
while(b%p[i]==)
{
b=b/p[i];
zhi[cnt1]++;
}
di[cnt1++]=p[i];
}
}
if(b>)
{
di[cnt1]=b;
zhi[cnt1++]=;
}
for(int i=cnt1-;i>;i--)
printf("%d %d ",di[i],zhi[i]);
printf("%d %d\n",di[],zhi[]);
}
else
{
double a=pow(z[],x[]);
while(scanf("%lf%lf%c",&z[cnt],&x[cnt],&s))
{
cnt++;
if(s=='\n')
break;
}
for(int i=;i<cnt;i++)
{
a*=pow(z[i],x[i]);
}
long long b=(long long) a;
b--;
for(int i=;i<ans;i++)
{
if(b%p[i]==)
{
while(b%p[i]==)
{
b=b/p[i];
zhi[cnt1]++;
}
di[cnt1++]=p[i];
}
}
if(b>)
{
di[cnt1]=b;
zhi[cnt1++]=;
}
for(int i=cnt1-;i>;i--)
printf("%d %d ",di[i],zhi[i]);
printf("%d %d\n",di[],zhi[]);
} }
return ;
}