Cod sursa(job #2155292)

Utilizator Alex18maiAlex Enache Alex18mai Data 7 martie 2018 19:28:54
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("sumdiv.in");
ofstream cout ("sumdiv.out");

const int MAX = 10000;

bool ciur [MAX + 5];
vector <int> prim;

void Ciur(){

    for (int i=2; i<=MAX; i++){
        if (!ciur[i]){
            prim.push_back(i);
            for (int j=i+i; j<=MAX; j+=i){
                ciur[j] = true;
            }
        }
    }
}

vector <pair<int , int>> DIV;

const int MOD = 9901;

int rid (int base , int put){

    int ans = 1;

    while (put){

        if (put % 2){
            ans *= base;
            ans %= MOD;
        }
        base *= base;
        base %= MOD;
        put /= 2;
    }

    return ans;

}

int main() {

    int a , b;
    cin>>a>>b;

    Ciur();

    int cop = a;

    for (auto &x : prim){
        if (x * x > a){
            break;
        }
        int cont = 0;
        while (!(cop % x)){
            cop /= x;
            cont++;
        }
        if (cont){
            DIV.push_back({x , cont*b});
        }
    }

    if (cop > 1){
        DIV.push_back({cop , b});
    }

    int sus = 1;
    int jos = 1;

    for (auto &x : DIV){
        int ridicat = rid(x.first , x.second+1);
        sus *= ridicat - 1;
        sus %= MOD;
        jos *= x.first - 1;
        jos %= MOD;
    }

    jos = rid(jos , MOD-2);
    sus *= jos;
    sus %= MOD;

    cout<<sus;

    return 0;
}