Cod sursa(job #2430522)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 15 iunie 2019 11:52:20
Problema Suma divizorilor Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int MOD = 9901;

int A, B;
vector < pair <int, int> > desc;

int sol = 1;

int lgput(int base, int exp)
{
    int ans = 1;
    int aux = base;

    for(int i = 1; i <= exp; i <<= 1)
    {

        if(i & exp)
            ans = (ans * aux) % MOD;

        aux = (aux * aux) % MOD;

    }

    return ans;
}

int main()
{
    fin >> A >> B;

    if(A == 0)
    {
        fout << 0;
        return 0;
    }

    if(A == 1)
    {
        fout << 1;
        return 0;
    }

    if(B == 0)
    {
        fout << 1;
        return 0;
    }

    for(int i = 2; i * i <= A; i++)
        if(A % i == 0)
        {
            int k = 0;

            while(A % i == 0)
            {
                A /= i;
                k++;
            }

            desc.push_back({i, k * B});
        }

    if(A != 1)
    {
        desc.push_back({A, B});
    }

    for(auto it : desc)
    {
        if(it.first % MOD == 1)
        {
            sol *= (B + 1) % MOD;
            sol %= MOD;
        }
        else
        {
            sol *= (lgput(it.first, it.second + 1) - 1) % MOD;
            sol %= MOD;
            sol *= lgput(it.first - 1, MOD - 2) % MOD;
            sol %= MOD;

            while(sol < 0)
                sol += MOD;
        }
    }

    fout << sol;

    return 0;
}