Cod sursa(job #1046833)

Utilizator Tux2NicolaeTelechi Nicolae Tux2Nicolae Data 3 decembrie 2013 17:00:32
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<bitset>
#define MOD 9973

const int DIM=1000000;
std::bitset<DIM> isprime;
int v[78500];

void eratostenes(){
    long long i,j;
    v[++v[0]]=2;
    for(i=3;i<=DIM;i+=2){
        if(isprime[i]==0){
            v[++v[0]]=i;
            for(j=i*i;j<=DIM;j+=(2*i)){
                isprime[j]=1;
            }
        }
    }
}

void solve(long long n,int& nr,int& sum){
    int i,exponent;
    long long div;
    sum=nr=1;

    for(i=1;i<=v[0] && (long long)v[i]*v[i]<=n;i++){
        if(n%v[i]) continue;

        div=v[i]; exponent=0;
        while(n%v[i]==0){
            n/=v[i];
            exponent++;
            div*=v[i];
        }
        sum=(((div-1)*sum)/(v[i]-1))%MOD;
        nr*=(exponent+1);
    }

    if(n>1){
        nr*=2;
        sum=(1LL*sum*(n+1))%MOD;
    }
}

int main(){
    int i,T,sum,nr;
    long long n;

    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);

    scanf("%d",&T);
    eratostenes();

    for(i=0;i<T;i++){
        scanf("%lld",&n);
        solve(n,nr,sum);
        printf("%d %d\n",nr,sum);
    }

    return 0;
}