#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000000
struct T
{
__int64 prime;
__int64 num;
};
T res[MAX];
__int64 p[MAX];
bool isprime[MAX];
__int64 pow(__int64 a,__int64 b)
{
__int64 i;
__int64 res=1;
for(i=1;i<=b;i++)
{
res*=a;
}
return res;
}
void cal(__int64 n)
{
__int64 i=0;//质数表中第i个质数
__int64 k=0;//结果的所用质数的数量
for(i=0;;i++)
{
if(n==1)
{
break;
}
if(n%p[i]==0)
{
res[k].prime=p[i];
res[k].num=1;
k++;
n=n/p[i];
}
while(n%p[i]==0)
{
res[k-1].num++;
n=n/p[i];
}
if(n==1)
{
break;
}
}
for(i=k-1;i>0;i--)
{
printf("%I64d %I64d ",res[i].prime,res[i].num);
}
printf("%I64d %I64d\n",res[0].prime,res[0].num);
}
void init()
{
memset(isprime,false,sizeof(isprime));
memset(p,0,sizeof(p));
__int64 np=0;
__int64 i,j;
for(i=2;i<MAX;i++)
{
if(!isprime[i])
{
p[np++]=i;
}
for(j=0;j<np&&p[j]*i<=MAX;j++)
{
isprime[p[j]*i]=true;
if(i%p[j]==0)
{
break;
}
}
}
}
int main()
{
init();
__int64 a,b;
char c;
__int64 n;
while(scanf("%I64d",&a),a)
{
n=1;
if(a==0)
{
break;
}
scanf("%I64d",&b);
n*=pow(a,b);
c=getchar();
if(c=='\n')
{
cal(n-1);
continue;
}
while(1)
{
scanf("%I64d %I64d",&a,&b);
n*=pow(a,b);
c=getchar();
if(c=='\n')
{
cal(n-1);
break;
}
}
}
return 0;
}
转载于:https://www.cnblogs.com/willzhang/archive/2012/07/12/2587368.html