Cod sursa(job #1687406)

Utilizator EberardoVladianu Cosmin Eberardo Data 12 aprilie 2016 20:49:00
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");


int a,b;

unsigned long long s=1,rezultat;

void citire()
{
    fin>>a>>b;
}

unsigned long long ridicare(int putere,unsigned long long numar)
{
    rezultat=1;
    while(putere)
    {
        if(putere%2)
        {
            rezultat*=numar;
            rezultat%=9901;
        }
        numar*=numar;
        numar%=9901;
        putere/=2;
    }
    return rezultat;
}

void gasire_divprim()
{
    int d=2,contor=0;
    unsigned long long sus,jos;
    if(a%2==0)
    {
        a/=2;
        contor++;
        while(a%2==0)
        {
            a/=2;
            contor++;
        }
        sus=ridicare(b*contor+1,2)-1;
        jos=1;
        s*=sus*jos;
        contor=0;
    }
    for(d=3;d*d<=a;d+=2)
    {
        if(a%d==0)
        {
            d%=9901;
            if(d!=1)
            {

            a/=d;
            contor++;
            while(a%d==0)
            {
                a/=d;
                contor++;
            }
            sus=ridicare(b*contor+1,d)-1;
            jos=ridicare(9899,d-1);
            s*=sus*jos;
            s%=9901;
            }
        }
    }
    if(a!=1)
    {
        a%=9901;
        if(a!=1)
       {

        sus=ridicare(b+1,a)-1;
        jos=ridicare(9899,a-1);
        s*=sus*jos;
        s%=9901;
       }
    }
}

int main()
{
    citire();
    if(b==0)
        s=1;
    else
        gasire_divprim();
    fout<<s;
    return 0;
}