Cod sursa(job #2370386)

Utilizator marius0072scarlat marius stefan marius0072 Data 6 martie 2019 11:54:16
Problema Suma divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>

std::ifstream f("sumdiv.in");
std::ofstream g("sumdiv.out");

const int MOD = 9901;
long long a,b;

long long lgput(long long a,long long b)
{
    unsigned long long r = 1;
    while(b)
    {
        if(b&1)
            r = ((r % MOD) * (a % MOD)) % MOD;
        a = ((a % MOD) * ( a % MOD)) % MOD;
        b >>= 1;
    }
    return (r % MOD);
}

long long FindSum(long long n,long long k)
{
    long long Result = 0;
    for(long long i = 0;i <= k;i++)
        Result = (Result + lgput(n,i)) % MOD;
    return Result;
}

void Descompose()
{
    long long d = 2,Res = 1,cnt = 0;
    while(d * d <= a)
    {
        cnt = 0;
        while(a % d)
        {
            a /= d;
            cnt++;
        }
        if(d % MOD != 1)
            Res = (long long)((long long)((Res * (lgput(d,cnt * b + 1) -1 + MOD) % MOD)) * (lgput(d -1 ,MOD -2 ) + MOD)) % MOD;
        else
            Res=(long long)(Res*FindSum(d,b))%MOD;
        d++;
    }
    if(a!=1)
    {
        if(a % MOD != 1)
            Res=(long long)((long long)((Res*(lgput(a,b+1)-1+MOD)%MOD))*(lgput(a-1,MOD-2)+MOD))%MOD;
        else
            Res = (long long)(Res * FindSum(a,b))%MOD;
    }
    g << Res % MOD;
}

int main()
{
    f >> a >> b;
    
    if(b == 0)
    {
        g << 1;
        return 0;
    }
    if(a == 0)
    {
        g << 0;
        return 0;
    }
    Descompose();
}