Cod sursa(job #2633076)

Utilizator OvidRata Ovidiu Ovid Data 6 iulie 2020 13:43:25
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
#define int ll
#define MOD 9901
ifstream fin("sumdiv.in"); ofstream fout("sumdiv.out");
#define cin fin
#define cout fout
int a, b;

int totient(int y){
int x=y;
int res=1;
for(int i=2; i<=x; i++){
    if(x%i==0){
        int pw=1;
        while(x%i==0){
            x/=i; pw*=i;
        }
        res*=(pw-pw/i);
    }
}

if(x>1){
    res*=(x-1);
}


return res;
}
int fi=totient(MOD);


int exp(int x, int e){
if(e==0){return 1;}
if(e==1){return x;}
return ( (exp(x, e%2))*( exp( (x*x)%MOD, e/2) ) )%MOD;
}

int inv(int x){
return exp(x, fi-1);
}












int32_t main(){
INIT
cin>>a>>b;
vector<pii> pr;


for(int i=2; i<=( (int)(sqrt(a)+2) ) && i<=a; i++){
    if(a%i==0){

        int e=0;
        while( (a%i)==0){
            a/=i; e++;
        }
        pr.pb(mp( (i)%MOD, e*b) );
    }
}
if(a>1){
    pr.pb(mp(a, b) );
}

int res=1;


for(int i=0; i<pr.size(); i++){
    res=(res*( ( (( exp(pr[i].ft, pr[i].sc+1)-1 +MOD    )%MOD)*( (inv( (pr[i].ft-1))+MOD)%MOD   ))%MOD     ))%MOD;
}
cout<<res;



return 0;
}