本以为会有什么简单的方法 但是没想出来 于是用笨方法水了一下 结果ac了
用字符串读入 转化成数组 再转化成数 素数筛一下 素因子分解 比较麻烦。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX=50000;
bool isprime[MAX];
int num_prime,prime[MAX],inum[MAX];
int num_factor[10000][2],num_sum;
char str[MAX];
void getprime()
{
memset(isprime,1,sizeof(isprime));
num_prime=0;
long long i,j;
for(i = 2;i<MAX;i++)
{
if(isprime[i]==1)
{
prime[num_prime++]=i;
for(j=i*i;j<MAX;j+=i)
isprime[j]=0;
}
}
}
int get_num()
{
memset(inum,0,sizeof(inum));
int len=strlen(str);
int j=0;
for(int i=0;i<len;i++)
{
if(str[i]==' ')
j++;
else
inum[j]=inum[j]*10+str[i]-'0';
}
return j;
}
long long transnum()
{
long long tnum=1;
int len=get_num();
for(int i=0;i<=len-1;i+=2)
{
for(int k=1;k<=inum[i+1];k++)
tnum*=inum[i];
}
return tnum;
}
void factor(long long x)
{
memset(num_factor,0,sizeof(num_factor));
num_sum=0;
for(int i=0;i<num_prime;i++)
{
if(x%prime[i]==0)
{
num_factor[num_sum][0]=prime[i];
num_factor[num_sum][1]++;
x/=prime[i];
while(x%prime[i]==0)
{
x/=prime[i];
num_factor[num_sum][1]++;
}
num_sum++;
}
}
if(x>1)
{
num_factor[num_sum][0]=x;
num_factor[num_sum][1]=1;
num_sum++;
}
}
int main()
{
getprime();
while(gets(str))
{
int w=get_num();
long long ans=transnum()-1;
if(ans==0)
break;
factor(ans);
for(int i=num_sum-1;i>=0;i--)
printf("%d %d ",num_factor[i][0],num_factor[i][1]);
printf("\n");
}
return 0;
}