Pagini recente » Borderou de evaluare (job #682104) | Borderou de evaluare (job #816354) | Borderou de evaluare (job #2695892) | Borderou de evaluare (job #2310160) | Cod sursa (job #1582501)
#include <iostream>
#include <fstream>
#define ll long long
#define pmax 1000000
#define mod 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bool ok[1000005];
int k,p[80005],pw[80005],nrd,ind;
ll dv[80005];
void GenPrimes()
{ int i,j;
for(i=3;i*i<=pmax;i+=2)
if (!ok[i])
{for(j=i*i;j<=pmax;j+=2*i)
ok[j]=1;
}
k=1; p[k]=2;
for(i=3;i<=pmax;i+=2)
if (!ok[i]) {k++; p[k]=i;}
}
void Desc(ll x)
{ int i,put=0;
nrd=0; ind=1;
while(1LL*p[ind]*p[ind]<=x && ind<=k)
{ put=0;
while(x%p[ind]==0)
{ put++;
x/=p[ind];
}
if (put) {nrd++; pw[nrd]=put; dv[nrd]=p[ind];}
ind++;
}
if (x>1) {nrd++; pw[nrd]=1; dv[nrd]=x;}
}
int LgPut(int a,int b)
{ int i,add=a,res=1;
for(i=0;i<=35;i++)
{if (b&(1LL<<i)) res=1LL*res*add%mod;
add=1LL*add*add%mod;
}
return res;
}
int Inv(int a,int b)
{ int i,c,r[35],nr=0,x,y,x2,y2,aux=b;
while(b)
{ c=a%b; nr++; r[nr]=a/b;
a=b; b=c;
}
x=1; y=0;
for(i=nr;i>=1;i--)
{ x2=y; y2=x-y*r[i];
x=x2; y=y2;
}
while(x<0) x+=aux;
return x;
}
void Solve(ll x)
{ int i,ans1=1,ans2=1;
if (x<=1) {g<<x<<" "<<x<<"\n"; return;}
for(i=1;i<=nrd;i++)
{ans1=1LL*ans1*(pw[i]+1)%mod;
ans2=1LL*(1LL*ans2*(LgPut(dv[i]%mod,pw[i]+1)-1+mod)%mod)*Inv((dv[i]-1)%mod,mod)%mod;
}
g<<ans1<<" "<<ans2<<"\n";
}
int main()
{ int i,t; ll x;
f>>t;
GenPrimes();
for(i=1;i<=t;i++)
{ f>>x;
Desc(x);
Solve(x);
}
return 0;
}