Cod sursa(job #1337788)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 9 februarie 2015 15:06:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#define mod 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long x;
int t, i, k, nr, aux, nrd, sd, v[1000010], p1, p2;
bool viz[1000010];

int putere(int x, int y){
    int aux=1;
    x%=mod;
    for(;y;y>>=1)
    {
        if(y&1)
            aux=(aux*x)%mod;
        x*=x;
        x%=mod;
    }
    return aux;
}

void ciur(){
    long long i, j;
    viz[0]=1;
    viz[1]=1;
    v[1]=2;
    k=1;
    for(i=3; i<1000001; i+=2)
        if(viz[i]==0)
        {
            v[++k]=i;
            for(j=i+i; j<1000001; j+=i)
                viz[j]=1;
        }
}

int main(){
    ciur();
    f>>t;
    for(;t;t--)
    {
        f>>x;
        i=1;
        nrd=1;
        sd=1;
        while(x>1 && 1LL*v[i]*v[i]<=x)
        {
            if(x%v[i]==0)
            {
                aux=1;
                nr=0;
                while(x%v[i]==0)
                    x/=v[i], nr++;
                aux=aux*v[i];
                nrd=nrd*(nr+1);
                sd=( sd*(aux-1)/(v[i]-1) )%mod;
                p1=( putere(v[i], nr+1)-1)%mod;
                p2=putere(v[i]-1, mod-2)%mod;
                sd=( ( (sd*p1)%mod )*p2 )%mod;
                if(sd==0)
                    sd=mod;
            }
            i++;
        }
        if(x>1)
        {
            nrd*=2;
            sd=( 1LL*sd*(x+1)%mod );
        }
        g<<nrd<<' '<<sd<<"\n";
    }
    return 0;
}