Cod sursa(job #1174564)

Utilizator heracleRadu Muntean heracle Data 23 aprilie 2014 12:21:53
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>

FILE* in;
FILE* out;


int euclid(int a, int b, int& x, int& y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }

    int d,x0,y0;

    d=euclid(b,a%b,x0,y0);

    x=y0;
    y=x0-(a/b)*y0;

    return d;
}


int a,b;

const int Q=100001,R=9901;

int div[Q],nr[Q],loc;

int pow(long long x, int p)
{
    long long rez=1;

    while(p)
    {
        if(p%2==1)
        {
            rez*=x;
            rez%=R;
        }

        p/=2;
        x=(x*x)%R;
    }
    return rez;
}



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

    fscanf(in,"%d%d",&a,&b);

    if(a==0)
    {
        fprintf(out,"0");
        return 0;
    }
    if(a==1 || b==0)
    {
        fprintf(out,"1");
        return 0;
    }

    int a0=a;
    int nra;
    for(int i=2; i*i<=a; i++)
    {
        if(a%i==0)
        {
            nra=0;
            while(a%i==0)
            {
                nra++;
                a/=i;
            }
            loc++;
            div[loc]=i;
            nr[loc]=nra*b;
        }
    }
    if(a>1)
    {
        div[++loc]=a;
        nr[loc]=b;
    }

    a=a0;

    long long rez=1;
    int act,aux;

    for(int i=1; i<=loc; i++)
    {
        rez*=pow(div[i],nr[i]+1)-1;
        rez%=R;

        aux=euclid(div[i]-1,R,act,aux);

        if(act<0)
            act+=R;
        rez*=act;
        rez%=R;
    }
    fprintf(out,"%d",rez);

    return 0;
}