Cod sursa(job #2430516)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 15 iunie 2019 11:25:02
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 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(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 % 9901) {
            sol = sol * (lgput(it.first, it.second + 1) - 1) * lgput(it.first, 9899);
            sol %= MOD;
        }
    }

    fout << sol;

    return 0;
}