Cod sursa(job #2930976)

Utilizator biancaivascuBianca Ivascu biancaivascu Data 29 octombrie 2022 22:35:29
Problema Suma divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

#define Nr 9901

void euclid(int a, int b, int &x, int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
    }
    else
    {
        int x0, y0;
        euclid(b, a%b, x0, y0);
        x=y0;
        y=x0-(a/b)*y0;
    }
}

int main()
{
    ifstream in("sumdiv.in");
    ofstream out("sumdiv.out");
    long long s=0;
    int a, b, exp, d,x, y, rez, cd;
    in>>a>>b;

    d=2;
    while(d*d<=a)
    {
        cd=d;
        while(a%d==0)
        {
            a=a/d;
            exp++;
        }
        if(exp>0)
        {
            exp*=b;
            exp+=1;
            rez=1;
            while(exp>0)
            {
                if(exp%2==1)
                    rez=(rez*d)%Nr;
                d=(d*d)%Nr;
                exp=exp/2;
            }
            rez=rez-1;

            euclid(cd-1, Nr, x, y);
            if(x<0) x+=Nr;
            s=(s+(rez*x)%Nr)%Nr;
        }
        exp=0;
        d++;
    }

    if(a>1)
    {
        exp=1; d=a;

        exp*=b;
        exp+=1;
        rez=1;
        while(exp>0)
        {
            if(exp%2==1)
                rez=(rez*d)%Nr;
            d=(d*d)%Nr;
            exp=exp/2;
        }
        rez=rez-1;
        d=a;
        euclid(d-1, Nr, x, y);
        if(x<0) x+=Nr;
        s=(s+(rez*x)%Nr)%Nr;
    }

    out<<s;
    return 0;
}