Cod sursa(job #1811056)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 20 noiembrie 2016 20:08:08
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<fstream>
#include<cmath>
#define mod 9901
using namespace std;
int a, b, i, e, sum, r;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int mult(int x, int e){
    if(e == 0){
        return 1;
    }
    else{
        int a = mult(x, e / 2);
        if(e % 2 == 0){
            return a * a % mod;
        }
        else{
            return a * a % mod * x % mod;
        }
    }
}
void invmod(int a, int b, int &x, int &y){
    if(b == 0){
        x = 1;
        y = 0;
    }
    else{
        int x2, y2;
        invmod(b, a % b, x2, y2);
        x = y2;
        y = x2 - a / b * y2;
    }
}
int calc(int a, int e){
    int pt, x, y;
    pt = mult(a, e * b + 1) - 1;
    if(pt < 0){
        pt += mod;
    }
    invmod(a - 1, mod, x, y);
    x %= mod;
    if(x < 0){
        x += mod;
    }
    int sol = pt * x % mod;
    return sol;
}
int main(){
    fin>> a >> b;
    r = sqrt(a * 1.0);
    sum = 1;
    for(i = 2; i <= r; i++){
        e = 0;
        while(a % i == 0){
            e++;
            a /= i;
        }
        if(e != 0){
            sum = sum * calc(i, e) % mod;
        }
    }
    if(a != 1){
        if(a % mod == 1){
            sum = sum * (b + 1) % mod;
        }
        else{
            sum = sum * calc(a, 1) % mod;
        }
    }
    fout<< sum <<"\n";
    return 0;
}