Mai intai trebuie sa te autentifici.
Cod sursa(job #1326205)
Utilizator | Data | 24 ianuarie 2015 21:30:20 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.3 kb |
#include <cstdio>
#define MOD 9973
#define NMAX 1000005
using namespace std;
long long N,x;
int T, K, P[NMAX];
char prim[NMAX];
void macel (){
int i,j;
prim[1]=0,prim[2]=1;
P[0]=2;
for (i=3;i<=NMAX;i+=2)
prim[i]=1;
for (i=3;i<=NMAX;i+=2){
if (prim[i]){
P[++K]=i;
for (j=i+i+i;j<=NMAX;j+=i<<1){
prim[j]=0;}
}
}
}
int ridicare(int x, int p)
{
int result = 1;
int i;
x = x % MOD;
for (i=1;i<=p;i++){
result =result*x;
result=result%MOD;
}
return result;}
void sol(int N){
int nd = 1, sd = 1;
int i;
for (i=0;i<=K&&1LL*P[i]*P[i]<=N;i++){
if (N%P[i])
continue;
int p=0;
while (N%P[i]==0){
N/=P[i];
p++;}
nd*=p+1;
int p1 = (ridicare(P[i], p+1) - 1) % MOD;
int p2 = ridicare(P[i]-1, MOD-2) % MOD;
sd = (((sd * p1) % MOD) * p2) % MOD;}
if (N>1&&P[i]*P[i]>N){
nd*=2;
sd = (1LL*sd*(N+1) % MOD);}
printf ("%d %d", nd, sd);
printf ("%c", '\n');}
int main()
{int i;
freopen ("ssnd.in", "r", stdin);
freopen ("ssnd.out", "w", stdout);
scanf ("%d", &N);
macel();
for (i=1;i<=N;i++){
scanf ("%d", &x);
sol(x);}
return 0;
}