poj 1365 Prime Land
#include<iostream>
#include<string>
using namespace std;
bool isprime(int n)
{
for(int i=2;i*i<=n;++i)
if(n%i==0)
return false;
return true;
}
int pe[1000];
int main()
{
string str;
while(getline(cin,str)&&str!="0")
{
int s=0,id=0;
for(int i=0;i<str.size();++i)
{
if(str[i]==' ')
pe[++id]=s,s=0;
else
s=10*s+str[i]-48;
}
pe[++id]=s;
int sum=1;
for(int i=1;i<=id/2;++i)
sum*=pow(pe[2*i-1]+0.0,pe[2*i]+0.0);
sum--;
id=1;
memset(pe,0,sizeof(pe));
for(int i=2;!isprime(sum);++i) //当sum=1时会跳出循环,所以不必另外判断
{
if(!isprime(i)||sum%i!=0)
continue;
while(sum%i==0)
{
pe[2*id-1]=i;
pe[2*id]++;
sum/=i;
}
id++;
}
if(sum>1) //若sum>1,则必是素数
{
pe[2*id-1]=sum;pe[2*id]++;
id++;
}
for(int i=id-1;i>=1;--i)
cout<<pe[2*i-1]<<" "<<pe[2*i]<<" ";
cout<<endl;
}
return 0;
}
//已知任意一个大于1的数可以表示成一些素数的乘积,即x=p1^e1*p2^e2……pn^en (pi 为素数,ei 为对应素数的个数),现给你x的表示,要你求x-1的表示。
//例:输入:5 1 2 1 则x=5^1*2^1=10,所以x-1=9,9可以表示成:9=3^2 输出:3 2