Cod sursa(job #3221848)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 8 aprilie 2024 11:08:34
Problema Suma divizorilor Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
const int mod = 9901;
int a, b;

static inline int Put(int a, int n) {
    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);
}

static inline int Divi(int a) {
    int d = 3;
    int sum = 1;

    if(a % 2 == 0) {
	int e = 0;
	while(a % 2 == 0) {
	    e++;
	    a >>= 1;
	}
        sum = sum * (Put(2, e * b + 1) + mod - 1) % mod;
	sum = sum * Inv(2 - 1) % mod;
    }

    while(d * d <= a) {
        int e = 0;
        while(a % d == 0) {
	    e++;
	    a /= d;
	}

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

    return sum;
}

int main() {
    fin >> a >> b;
    fout << Divi(a);

    return 0;
}