Cod sursa(job #3199743)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 2 februarie 2024 16:26:09
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
const int mod = 9901;
int n, b, d, e;
long long sum = 1;

static inline int Put(int a, int n) {
    a %= mod;
    int p = 1;
    while(n) {
        if(n & 1) p = (p * a) % mod;
        a = (a * a) % mod;
        n >>= 1;
    }
    return p;
}

static inline int Inv(int a) {
    return Put(a, mod - 2);
}

int main() {
    fin >> n >> b;
    
    while(n % 2 == 0) {
    	e++;
	n /= 2;
    }
    if(e) sum = sum * (Put(2, e * b + 1) + mod - 1) % mod;

    d = 3;
    while(d * d <= n) {
        e = 0;
        while(n % d == 0) {
            e++;
            n /= d;
        }

        if(e) {
	    if(d % mod == 1) sum = (sum * Put(d, e * b + 1)) % mod;
    	    else if(d % mod) sum = sum * (Put(d, e * b + 1) + mod - 1) % mod * Inv(d - 1) % mod;        
        }

        d += 2;
    }
    if(n > 1) {
        if(n % mod == 1) sum = (sum * (e * b + 1)) % mod;
    	else if(d % mod) sum = sum * (Put(n, 1 * b + 1) + mod - 1) % mod * Inv(n - 1) % mod;   
    }

    fout << sum;

    return 0;
}