Cod sursa(job #1246328)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 20 octombrie 2014 22:30:05
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#define MAXK 78498
#define ALA_MARE 1000000
#define MOD 9973
char c[ALA_MARE+1];
int p[MAXK], k;
inline void ciur(){
    int i, j;
    for(i=2; i*i<=ALA_MARE; i++){
        if(c[i]==0){
            for(j=i*i; j<=ALA_MARE; j+=i){
                c[j]=1;
            }
        }
    }
    k=0;
    for(i=2; i<=ALA_MARE; i++){
        if(c[i]==0){
            p[k++]=i;
        }
    }
    //printf("%d", k);
}
inline long long a_la_n(int a, int n){
    int rez;
    rez=1;
    while(n!=0){
        if((n&1)==1){
            rez*=a;
            rez%=MOD;
        }
        a*=a;
        a%=MOD;
        n>>=1;
    }
    return rez;
}
inline int invers(int a){
    return a_la_n(a, MOD-2);
}
int main(){
    int T, t, d, a, b, nd, sd, i;
    long long n;
    FILE *fin, *fout;
    fin=fopen("ssnd.in", "r");
    fout=fopen("ssnd.out", "w");
    ciur();
    fscanf(fin, "%d", &T);
    for(t=0; t<T; t++){
        fscanf(fin, "%lld", &n);
        nd=1;
        sd=1;
        i=0;
        while((i<k)&&(1LL*p[i]*p[i]<=n)){
            if(n%p[i]==0){
                d=1;
                a=1;
                while(n%p[i]==0){
                    n/=p[i];
                    d++;
                    a*=p[i];
                    a%=MOD;
                }
                nd*=d;
                a=(a*p[i]-1+MOD)%MOD;
                b=(p[i]-1+MOD)%MOD;
                sd=(((a*sd)%MOD)*invers(b))%MOD;
            }
            i++;
        }
        if(n!=1){
            nd*=2;
            /*
            a=(n*n-1+MOD)%MOD;
            b=(n-1+MOD)%MOD;
            sd=(((a*sd)%MOD)*invers(b))%MOD;
            */
            sd=(sd*((n+1)%MOD))%MOD;
        }
        fprintf(fout, "%d %d\n", nd, sd);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}