Pagini recente » Cod sursa (job #1418407) | Cod sursa (job #1493697)
#include <cstdio>
#include <math.h>
#define MOD 9973
#define VMAX 1000007
#define NMAX 80007
#define LL long long
int prim[NMAX], n, ct = 1, len, c;
char ciur[VMAX];
LL nr, ans, sum;
LL power(LL a, LL b)
{
LL sol = 1;
for(; b; b>>=1)
{
if(b&1)
{
sol *= a;
}
a*= a;
}
return sol;
}
void init()
{
//printf("check1\n");
for(int i = 2; i<= VMAX-1; ++i)
{
if(ciur[i]) continue;
if(i*i >= VMAX) break;
for(int j = i*i; j<= VMAX-1; j+=i) ciur[j] = 1;
}
//printf("check1\n");
for(int i = 2; i<= VMAX-1; ++i)
{
if(ciur[i]) continue;
prim[ct] = i;
ct++;
}
}
void solve()
{
for(int i = 1; i< ct; ++i)
{
if(prim[i]*prim[i] > nr) break;
//printf("nr = %lld i = %d prim[i] = %d\n", nr, i, prim[i]);
if(nr%prim[i]) continue;
//printf("check\n");
c = 0;
while(!(nr%prim[i]))
{
nr /= prim[i];
++c;
}
ans *= (c+1);
sum *= (power(prim[i], c+1)-1);
sum /= (prim[i]-1);
sum %= MOD;
//printf("nr = %lld ans = %lld sum = %lld\n", nr, ans, sum);
if(nr == 1) break;
//printf("nr = %lld ans = %lld sum = %lld\n", nr, ans, sum);
}
//printf("check5\n");
if(nr-1)
{
ans *= 2;
sum *= (nr*nr-1);
sum /= (nr-1);
sum %= MOD;
}
}
int main()
{
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
//printf("check\n");
init();
scanf("%d", &n);
//printf("check\n");
for( ; n; --n)
{
scanf("%lld", &nr);
ans = 1;
sum = 1;
len = sqrt(nr);
//printf("check3\n");
solve();
//printf("check4\n");
printf("%lld %lld\n", ans, sum);
}
return 0;
}