Cod sursa(job #2155311)

Utilizator Alex18maiAlex Enache Alex18mai Data 7 martie 2018 19:48:05
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>

using namespace std;

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

const long long MAX = 10000;

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

void Ciur(){

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

vector <pair<long long , long long>> DIV;

const long long MOD = 9901;

long long rid (long long base , long long put){

    long long ans = 1;

    while (put){

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

    return ans;

}

int main() {

    long long a , b;
    cin>>a>>b;

    Ciur();

    long long cop = a;

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

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

    long long sus = 1;
    long long jos = 1;

    for (auto &x : DIV){

        if (!((x.first - 1) % MOD)){
            sus *= x.second + 1;
            continue;
        }

        long long 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;
}