Pagini recente » Cod sursa (job #2820120) | Cod sursa (job #96940) | Cod sursa (job #2365764) | Cod sursa (job #1900358) | Cod sursa (job #2277112)
#include <cstdio>
#include <bits/stdc++.h>
#define big 1000005
#define MOD 9973
using namespace std;
long sir[1000005];
long prime[100000];
int lp=0;
int t;
int ldesc=-1;
struct factori
{
long factor;
long putere;
}desc[100000];
pair<long, long> inversmod(int a, int b)
{
if (b == 0)
return { 1, 0 };
pair <long,long>p = inversmod(b, a % b);
return { p.second, p.first - a / b * p.second };
}
void genciur()
{
for(int i=3;i<big;i+=2)
if(!sir[i])
{
prime[++lp]=i;
for(int j=2*i;j<=big;j+=i)
sir[j]=1;
}
prime[0]=2;
}
long logp(long p,long n)
{
long t=1;
while(p>1)
{
if(p%2==1)
{
t=(t % MOD)*(n % MOD);
p--;
}
n=(n*n)%MOD;
p/=2;
}
return (n*t)%MOD;
}
void calcul()
{
char c[13];
long n=0;
ldesc=-1;
scanf("%s\n",&c);
int l=strlen(c);
for(int i=0;i<l;i++)
{
n=n*10+(c[i]-'0');
}
for(int i=0;i<lp && n!=1;i++)
if(i*i>n)
{
desc[++ldesc].factor=n;
desc[ldesc].putere=1;
break;
}
else if(n%prime[i]==0)
{
desc[++ldesc].factor=prime[i];
desc[ldesc].putere=0;
while(n%prime[i]==0)
{
n/=prime[i];
desc[ldesc].putere++;
}
}
int nrdiv=1;
for(int i=0;i<=ldesc;i++)
nrdiv*=desc[i].putere+1;
printf("%ld ",nrdiv);
long sumadiv=1;
for(int i=0;i<=ldesc;i++)
{
if((desc[i].factor-1)!=0)
{
long p=logp(desc[i].putere+1,desc[i].factor)-1;
if(p<0)
p+=MOD;
sumadiv*=p;
sumadiv=sumadiv % MOD;
long a=inversmod((desc[i].factor-1),MOD).first;
while(a<0)
a+=MOD;
sumadiv*=a%MOD;
sumadiv=sumadiv % MOD;
}
else
sumadiv*=desc[i].putere+1;
}
printf("%ld\n",sumadiv);
}
void prelucrare()
{
scanf("%d\n",&t);
for(int i=0;i<t;i++)
{
calcul();
}
}
int main()
{
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
genciur();
prelucrare();
return 0;
}