Cod sursa(job #2981841)

Utilizator alexcostinCostin Alexandru alexcostin Data 18 februarie 2023 20:21:40
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f ("sumdiv.in");
ofstream g ("sumdiv.out");

const int MaxDiv = 10;
const int MOD = 9901;
int base[MaxDiv+1];
int expo[MaxDiv+1];
int nrp;

void desc(int a,int b){
    int d = 2;
    while (d * d <= a){
        if (a % d == 0){
            nrp++;
            base[nrp] = d;
            while(a % d == 0){
                a /= d;
                expo[nrp] += b;
            }
        }
        d++;
    }
    if (a > 1) {
        nrp++;
        base[nrp] = a;
        expo[nrp] = b;
    }
}

int fast_power(int a,int n){
    a %= MOD;
    int prod = 1;
    while(n > 0){
        if(n % 2 == 1){
            prod = prod * a % MOD;
        }
        a = a * a % MOD;
        n /= 2;
    }
    return prod;
}

int invers_modular(int a){
    return fast_power(a,MOD-2);
}

int main(){
    int a, b;
    f >> a >> b;
    desc(a,b);
    int s = 1;
    for(int i = 1;i <= nrp; i++){
        if (fast_power(base[i],expo[i]+1) != 1) {
            s = s*(fast_power(base[i],expo[i]+1)- 1 + MOD) % MOD;
            s = s*invers_modular(base[i]-1) % MOD;
        }
        else{
            s = s*(expo[i] + 1) % MOD;
        }
    }
    g << s;
}