题意:
给2*n个数,输入的这些数构成 sum=(a[1]^b[1])*(a[2]^b[2])...
其实就是整数分解完的数。
然后让你输出分解sum-1的结果。
从大到小。
思路:
就是输入麻烦点。
注意题目说了1的时候要输出空行。
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#include"stack"
#include"vector"
#define ll __int64
#define inf -999999999999999999LL
using namespace std;
char v[123456];
#define MAXN 100007
bool mark[MAXN];
int ss[MAXN/3],sscnt;
int ans1[MAXN/3],ans2[MAXN/3];
void ssb()
{
sscnt=0;
memset(mark,false,sizeof(mark));
mark[0]=mark[1]=true;
for(int i=2; i<=MAXN; i++)
{
if(!mark[i])
{
for(int j=i+i; j<=MAXN; j+=i) mark[j]=true;
ss[sscnt++]=i;
}
}
return ;
}
int main()
{
ssb();
while(gets(v),strcmp(v,"0"))
{
int f=0,i=0;
ll a=0,b=0;
ll sum=1;
while(v[i])
{
if(v[i]>='0' && v[i]<='9')
{
while(v[i]>='0' && v[i]<='9')
{
if(!f) a=a*10+v[i]-'0';
else b=b*10+v[i]-'0';
i++;
}
if(f==1)
{
sum*=(ll)(pow(a*1.0,b*1.0)+0.0000001);
a=0;
b=0;
}
f^=1;
}
else i++;
}
sum--;
int kx=0;
for(int i=0; i<sscnt; i++)
{
if((ll)ss[i]>sum) break;
if(sum%ss[i]==0)
{
int tep=0;
while(sum%ss[i]==0)
{
tep++;
sum/=ss[i];
}
ans1[kx]=i;
ans2[kx++]=tep;
}
}
if(kx==0)
{
puts("");
continue;
}
for(int i=kx-1;i>=0;i--)
{
printf(i==0?"%d %d\n":"%d %d ",ss[ans1[i]],ans2[i]);
}
}
return 0;
}