Cod sursa(job #3163525)

Utilizator Minea_TheodorMinea Theodor Stefan Minea_Theodor Data 31 octombrie 2023 16:04:35
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int mod(long long a)
{
    long long r = a % 9901;
    while(r < 0)
        r+=9901;
    return r;
}

int pow(long long a, long long b)
{
    if (b==0)
        return 1;
    int f = mod(pow(a, b >> 1));
    int r = mod(f*f);
    if(b & 1)
        r=mod(r * a);
    return r;
}

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

int invmod(long long a)
{
    int x, y;
    cmmdc(a, 9901, x, y);
    return mod(x);
}

int prg(long long a, long long b)
{
    if(a==1)
        return b+1;
    int a1 = mod(pow(a, b+1)-1);
    int a2 = mod(invmod(a-1));
    return mod(a1 * a2);
}

int main()
{
    long long a, b;
    fin >> a >> b;
    if(mod(a)==0)
    {
        fout << 1;
        return 0;
    }
    while(a%2==0)
    {
        p++;
        a/=2;
    }
    long long r=mod(prg(2, p * b));
    for (int i=3; i*i <= a; i+=2)
    {
        if(a%i)
            continue;
        long long p=0;
        while(a%i==0)
        {
            p++;
            a/=i;
        }
        r=mod(r*prg(mod(i), p*b));
    }
    if(a>1)
        r=mod(r*prg(mod(a), b));
    fout << r;
    return 0;
}