Cod sursa(job #3151853)

Utilizator alexvali23alexandru alexvali23 Data 23 septembrie 2023 00:43:03
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
long long sumDiv;
long long A, B;
int t;
const int MOD = 9973;
unsigned long long powlg(unsigned long long  n, unsigned long long  p)
{
    unsigned long long val = 1, x = n % MOD;
    while(p)
    {
        if(p & 1)
            val = 1ULL * val * x % MOD;
        x = 1ULL * x * x % MOD;
        p >>= 1;
    }
    return val;
}

void sdiv(long long n)
{
    sumDiv = 1;
    if(n % 2 == 0)
    {
        int p = 0;
        while(n % 2 == 0)
        {
            p++;
            n /= 2;
        }
        sumDiv = powlg(2, p + 1) - 1;
    }
    for(int d = 3; 1LL * d * d <= n; d += 2)
    {
        if(n % d == 0)
        {
            int p = 0;
            while(n % d == 0)
            {
                p++;
                n /= d;
            }
            sumDiv *= (1LL * (powlg(d, p + 1) - 1) % MOD * powlg(d - 1, MOD - 2)) % MOD;
        }
    }
    if(n > 1)
    {
        sumDiv = (1LL * sumDiv * (n + 1)) % MOD;
    }
}

int main()
{
    f >> A >> B;
    sdiv(powlg(A, B));
    g << sumDiv % MOD;
    return 0;
}