Cod sursa(job #936039)

Utilizator Master011Dragos Martac Master011 Data 5 aprilie 2013 13:38:14
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#define CLOSE fclose(in); fclose(out); return 0;
using namespace std;
FILE *in,*out;

const int MOD = 9973;
int T,v[1000100],prime[100000],nrp;

void ciur(){
    prime[++nrp]=2;
    for(register int i = 3; i<=1000000; i+=2)
        if(!v[i]){
            prime[++nrp]=i;
            for(register long long j = (long long)i*i, cresc=2*i; j <=1000000; j+=cresc)
                v[j]=1;
        }
}

long long power(int a, int b){
    if(b==1)
        return a;
    if(b%2==0)
        return power(a*a, b/2);
    if(b%2==1)
        return a* power(a*a, (b-1)/2);
}

void rezolvare(){
    long long N;
    fscanf(in,"%lld",&N);

    int i = 1, Nrdiv=1, pow;
    long long suma=1;
    while(i<=nrp && prime[i]*prime[i]<=N){
        pow=0;
        while(N%prime[i]==0){
            N/=prime[i];
            pow++;
        }
        if(pow){
            Nrdiv=Nrdiv*(pow+1);
            suma=suma*((power(prime[i],pow+1)-1)/(prime[i]-1));
        }
        ++i;
    }
    if(N>1){
        Nrdiv=Nrdiv*2;
        suma=suma*((N*N-1)/(N-1));
    }
    fprintf(out, "%d %lld\n",Nrdiv,suma%MOD);
}

int main(){
    in=fopen("ssnd.in","r");
    out=fopen("ssnd.out","w");

    ciur();
    for(fscanf(in,"%d",&T); T; T--)
        rezolvare();

    CLOSE
}