Pagini recente » Cod sursa (job #1249580) | Cod sursa (job #3239649) | Cod sursa (job #723203) | Cod sursa (job #2355152) | Cod sursa (job #2287047)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD=9973;
const int NMAX= 1000007;
//STIM CA n = f1^e1 + f2^e2 +...+ fk^ek
//NR DIVIZORILOR = (e1+1) * (e2+1) * ... *(ek+1)
//SUMA DIVIZORILOR (p1^(d1+1)-1)/(p1-1) * p2^(d2+1)-1)/(p2-1) * ... * pk^(dk+1)-1)/(pk-1)
//nr divizorilor
long long nr=1;
//suma divizorilor
long long numitor=1, numarator=1, p;
//vom genra sirul lui ratostene pana la 10^6, pentru a afla direct divizorii primi si a mai salva din timpul de executie
vector <int>prim;
bool vprim[NMAX+5];
void ciur_erathostene()
{
int i, j;
for(i=2;i<=NMAX;i++)
{
if(vprim[i]==0)
{
prim.push_back(i);
for(j=i+i;j<=NMAX;j=j+i)
vprim[j]=1;
}
}
}
long long lg_putere(long long a, long long b)
{
long long p=1;
while(b>0)
{
if(b&1)
p = (p *(a%MOD))%MOD;
a = ((a%MOD) *(a%MOD))%MOD;
b=b>>1;
}
return p;
}
void factori_primi(long long n)
{
nr=1;
numarator=numitor=1;
int e=0, ind=0, d;
long long aux;
d=prim[ind];
while(d*d<=n and n>1)
{
e=0;
while(n%d==0)
{
e++;
n=n/d;
}
if(e>0)
{
nr=(nr*(e+1))%MOD;
aux=lg_putere(d, e+1);
numarator = (1ll*numarator * ( (aux-1) % MOD )) %MOD;
numitor = (1ll*numitor * ( (d-1) %MOD ))%MOD;
}
ind++;
d=prim[ind];
}
if(n>1)
{
nr=(nr*2)%MOD;
aux=lg_putere(n, 2);
numarator = (1ll*numarator * ( (aux-1) % MOD )) %MOD;
numitor = (1ll*numitor * ( (n-1) %MOD ))%MOD;
}
//numitorul va fi invers modular
numitor = lg_putere(numitor, MOD-2);
p = (1ll*numarator*numitor)%MOD;
}
int main()
{
long long n;
int t;
ciur_erathostene();
fin>>t;
for(int i=1;i<=t;i++)
{
fin>>n;
factori_primi(n);
fout<<nr%MOD<<" ";
fout<<p<<"\n";
}
return 0;
}