Cod sursa(job #626906)

Utilizator SpiderManSimoiu Robert SpiderMan Data 28 octombrie 2011 16:24:57
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
//numarul divizorilor si suma lor
#include <cstdio>

#define nmax 1000010
#define modulo 9973

bool v[nmax];
int prim[nmax/2],k=0;

void ssnd(int &suma,int &nr, long long n) {
    int p;
    long long q=1;
    nr=1;
    suma=1;
    for(int i=0;i<k && 1LL*prim[i]*prim[i]<=n;++i) {
        if(n%prim[i]) continue;
        p=1;
        q=prim[i];
        while (n%prim[i]==0) {
            n/=prim[i];
            p++;
            q*=prim[i];
        }
        nr*=p;
        suma=(suma*(q-1)/(prim[i]-1))%modulo;
    }
    if (n>1) {
        nr*=2;
        suma = (1LL*suma*(n+1)) % modulo;
    }

}

int main() {
    int t;
    long long n;
    int suma,nr;
    //generez, cu ciurul lui eratostene, toate nr prime <=10^6
    int i=2,j;
    while(i<nmax) {
        if(v[i]==0) {
            //deci i e numar prim
            prim[k++]=i;
            //notez in tot vectorul
            for(j=i+i; j<nmax; j+=i)
                v[j]=1;
        }
        i++;
    }

    FILE *fin=fopen("ssnd.in","r");
    FILE *fout=fopen("ssnd.out","w");
    fscanf(fin,"%d",&t);

    for(i=0; i<t; i++) {
        fscanf(fin,"%lld",&n);
        ssnd(suma,nr,n);
        fprintf(fout,"%d %d\n",nr,suma);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}