Pagini recente » Cod sursa (job #2528533) | Cod sursa (job #1618901) | Cod sursa (job #2256251) | Cod sursa (job #805802) | Cod sursa (job #1573435)
#include<iostream>
#include<fstream>
#define numar 1000005
#define R 9973
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
bool a[1000005];
long long int nr_div, suma_div, suma_par;
long long int n;
int prime[100600];
void Generare_Ciur()
{
int i, j, nr=0;
prime[++nr] = 2;
for (i=3; i<=numar; i=i+2)
{ if (!a[i])
{ prime[++nr] = i;
for (j=i+i; j<=numar; j=j+i)
a[j]=1;
}
}
}
long long int Ridicare(long long int p, long long int n)
{
long long int x = 1;
while (n>0)
{
if (n & 1 == 1)
{ n--;
x=((x%R)*(p%R))%R;
}
n >>= 1;
p=((p%R)*(p%R))%R;
}
return x;
}
void Descompunere(long long int n)
{
long long int i, j, d, k;
long long int x, y;
i = 1;
nr_div = 1; suma_div = 1;
while (n>1 && prime[i]*prime[i] <= n)
{
d = prime[i];
if (n%d == 0)
{
k = 0;
while (n%d == 0)
{
n = n/d;
k++;
}
nr_div *= (k+1);
x = Ridicare(d, k+1) - 1;
if (x == -1) x += R;
y = Ridicare(d-1, R-2);
suma_par = (x*y) % R;
suma_div = (suma_div * suma_par) % R;
}
i++;
}
if (n!=1)
{
/// mi-a mai ramas un factor prim tot in n
nr_div *= 2;
x = Ridicare(n, 2) - 1;
if (x == -1) x += R;
y = Ridicare(n-1, R-2);
suma_par = (x*y) % R;
suma_div = (suma_div * suma_par) % R;
}
fout << nr_div << " " << suma_div;
}
int main ()
{
int i, T;
fin >> T;
Generare_Ciur();
for (i=1; i<=T; i++)
{
fin >> n;
Descompunere(n);
fout << "\n";
}
fin.close();
fout.close();
return 0;
}