Cod sursa(job #2931059)

Utilizator TheEpicWipedCreaVlad Chirita Alexandru TheEpicWipedCrea Data 30 octombrie 2022 13:55:02
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in  ("sumdiv.in");
ofstream out("sumdiv.out");

#define MaxDiv 10
#define MOD 9901

int base[MaxDiv+1];
int exp[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;
                exp[nrp]+=b;
            }
        }
        d++;
    }
    if(a>1){
        nrp++;
        base[nrp]=a;
        exp[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;
    in>>a>>b;

    desc(a,b);

    int s=1;
    for(int i=1;i<=nrp;i++){
        if(fast_power(base[i],exp[i]+1)!=1){
            s=s*(fast_power(base[i],exp[i]+1)-1+MOD)%MOD;
            s=s*invers_modular(base[i]-1)%MOD;
        }
        else{
            s=s*(exp[i]+1)%MOD;
        }
    }

    out<<s;
}