Pagini recente » Cod sursa (job #2540184) | Cod sursa (job #2685169) | Cod sursa (job #1023546) | Cod sursa (job #1326496) | Cod sursa (job #624051)
Cod sursa(job #624051)
#include <cstdio>
using namespace std;
bool v[1000001];
int p[80000],inv[10000];
long long nr,s;
inline int mod(int x)
{
int a=x%9973;
if(a<0)
return 9973+a;
else
return a;
}
void euclidext(int a, int b, int &x, int &y)
{
if (b==0)
{
x=1;
y=0;
return;
}
int x1,y1,q=a/b;
euclidext(b,a%b,x1,y1);
x=y1;
y=x1-y1*q;
}
void invers(int i)
{
int x,y;
euclidext(i,9973,x,y);
inv[i]=mod(x);
}
void functie()
{
for(int i=1;i<=9972;++i)
{
invers(i);
}
}
void ciur()
{
long long i,j;
for(i=2;i<=1000000;++i)
{
if(v[i]==true)
continue;
p[++p[0]]=i;
for(j=i;j*i<=1000000;++j)
{
v[i*j]=true;
}
}
}
inline int minus1(long long x)
{
int r = (x-1)%9973;
if(r < 0) r+=9973;
return r;
}
void descompune(long long x)
{
long long i,put;
nr=1;
s=1;
for(i=1;p[i]*p[i]<=x;++i)
{
long long a;
if(x%p[i]==0)
{
a=p[i]*p[i];
put=1;
x/=p[i];
while(x%p[i]==0)
{
x/=p[i];
put++;
a=(a*p[i])%9973;
}
nr*=put+1;
s=((s*(minus1(a)))%9973*inv[minus1(p[i])])%9973;
}
}
if(x!=1)
{
nr*=2;
s=s*(x+1)%9973;
}
}
int main()
{
long long n,x,i;
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%lld",&n);
ciur();
functie();
for(i=1;i<=n;++i)
{
scanf("%lld",&x);
descompune(x);
printf("%lld %lld\n",nr,s);
}
return 0;
}