Cod sursa(job #2507151)

Utilizator victoreVictor Popa victore Data 9 decembrie 2019 18:29:48
Problema Suma divizorilor Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
//check check check
#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<queue>
#include<cstring>
#include<map>
#include<iomanip>
#include<set>

#define ll long long
#define pb(x) push_back(x)

using namespace std;

typedef pair<ll,ll> ii;

const ll NMAX = 0;
const ll MOD = 9901;

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

ll pow2(ll n,ll e)
{
    ll p = 1;
    while(e)
    {
        if(e&1)
            p = (p*n)%MOD;
        n = (n*n)%MOD;
        e>>=1;
    }
    return p;
}

int main()
{
    ll N,i,j,A,B;
    fin>>A>>B;
    ll rez = 1;
    for(i = 2 ; i*i <= A ; ++i)
    {
        if(A%i == 0)
        {
            //i e un numar prim care il divide pe A
            ll cnt = 0;
            while(A%i == 0)
            {
                cnt++;
                A/=i;
            }
            ll aux = ( ( (pow2(i%MOD , B*cnt + 1 ) - 1 + MOD)%MOD )* pow2((i-1+MOD)%MOD , MOD - 2) ) % MOD;
            rez = (rez * aux) % MOD;
        }
    }

    if(A > 1)
    {
        if(A % MOD != 1)
        {
            ll aux = ( ( (pow2(A , B + 1) - 1 )%MOD )*pow2(A-1 , MOD - 2) ) %MOD;
            rez = (rez*aux)%MOD;
        }
        else
            rez = (rez * ( ( B + 1 ) % MOD ) ) %MOD;
    }

    fout<<rez;

    return 0;
}