Cod sursa(job #1687556)

Utilizator EberardoVladianu Cosmin Eberardo Data 12 aprilie 2016 22:10:23
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
using namespace std;

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


int a,b;

long long s=1,rezultat;

vector<long long>prime,puteri;

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

long long ridicare(int putere, 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;
     long long sus,jos;
     long long x;
    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;
        s%=9901;
        contor=0;
    }
    for(d=3;d*d<=a;d+=2)
    {
        if(a%d==0)
        {
            x=d%9901;
            if(x!=1)
            {

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

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

       s%=9901;
    }
}

int main()
{
    citire();
    if(b==0)
        s=1;
    else
        gasire_divprim();
    fout<<s;
    //fout<<endl<<ridicare(9899,11);
    return 0;
}