Pagini recente » Cod sursa (job #335143) | Borderou de evaluare (job #703365) | Diferente pentru utilizator/lorenasfat intre reviziile 2 si 3 | Borderou de evaluare (job #3172486) | Cod sursa (job #799879)
Cod sursa(job #799879)
#include <fstream>
#define LL long long
#define MOD 9973
using namespace std;
int t,nr = 1,k;
LL n;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int MAXSIZE = 1000001;
int r [80000];
LL p[80000];
int d[80000];
char w [MAXSIZE]; //p[i] == 0 if i is prime
inline int pow(int n,int k)
{
if(k == 1)
return n;
else
{
long long v = pow(n,k/2)%MOD;
if(k%2)
return (n*(v*v))%MOD;
else
return (v*v)%MOD;
}
}
inline void ciur()
{ int i, j;
for (i = 2; i <= 500000; ++i)
if (w[i] == 0)
for (j = i + i; j <= 1000000; j += i) w[j] = 1;
r[1] = 2;
for( int i = 3; i <= 1000000; i+=2 )
{
if(!w[i]) //cout << i << ' ',
r[++nr] = i;
}
}
inline void desc( LL n , int &k )
{
k = 0;
int i = 1;
while(n > 1)
{ if(!(n%r[i]))
{
p[++k] = r[i]; d[k] = 0;
while(!(n%r[i]))
{ d[k]++;
n/=r[i];
}
}
i++;
}
}
inline int nrDiv(int k)
{
int divs = (d[1] + 1)%MOD;
for( int i = 2; i <=k; i++ )
{
divs *= (d[i] + 1)%MOD;
}
return divs%MOD;
}
inline int sDivs(int k)
{
int power = pow(p[1],d[1]+1);
int s = (power - 1)/(p[1]-1)%MOD;
for(int i = 2; i <=k; i++)
{
power = pow(p[i],d[i]+1);
s *= (power - 1)/(p[i]-1)%MOD;
}
return s;
}
int main()
{
ciur();
f >> t;
while(t--)
{
f >> n;
desc( n,k );
g << nrDiv(k);
g << ' ' << sDivs(k);
g << '\n';
}
return 0;
}