Cod sursa(job #1328273)

Utilizator tudor_bonifateTudor Bonifate tudor_bonifate Data 28 ianuarie 2015 10:15:24
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#define MOD 9973
#define NMAX 1000005
using namespace std;
unsigned 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;}
            }
    }
}
long long ridicare(long long baza, long long exp)
{
    long long res=1;
    while (exp>0)
    {
        if (exp%2) res=(res*baza) % MOD;
        baza=(baza*baza) % MOD;  exp/=2;
    }
    return res % MOD;
}

    void sol( long long  N){
            int nd = 1, sd = 1;
  long long 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&&1LL*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 ("%lld", &x);
sol(x);}
return 0;
}