Cod sursa(job #936004)

Utilizator Master011Dragos Martac Master011 Data 5 aprilie 2013 12:46:30
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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(){

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

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

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

    int i = 1, Nrdiv=1, suma=1, pow;
    while(i<nrp && prime[i]<=N){
        pow=0;
        while(N%prime[i]==0){
            N/=prime[i];
            pow++;
        }
        if(pow){
            Nrdiv=Nrdiv*(pow+1)%MOD;
            suma=suma*((power(prime[i],pow+1)-1)/(prime[i]-1));
        }
        ++i;
    }

    fprintf(out, "%d %d\n",Nrdiv,suma);
}

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

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

    CLOSE
}