Cod sursa(job #2076084)

Utilizator savigunFeleaga Dragos-George savigun Data 26 noiembrie 2017 09:49:21
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MOD = 9901;
int a, b, oa;
long long sum = 1;
bool use[7100];

void fill(int p) {
    for (int i = p + p; i * i <= a; i += p) use[i] = true;
}

int pow(int a, int n) {
    a %= MOD;
    if (n == 1) return a;
    if (n % 2 == 0) return pow(a * a, n / 2);
    return (a * pow(a, n - 1)) % MOD;
}

int geometrique(int q, int n) {
    q %= MOD;
    if (q == 1) return n + 1;

    int nr = pow(q, n + 1) - 1;
    int num = pow(q - 1, MOD - 2);

    return (nr * num) % MOD;
}

void add (int p) {
    if (a % p != 0) return;

    int exp = 0;
    while (a % p == 0) {
        exp++;
        a /= p;
    }

    sum *= geometrique(p, exp * b);
    sum %= MOD;
}

int main()
{
    in >> a >> b;
    int p;
    oa = a;

    for (p = 2; p * p <= a; ++p) {
        if (!use[p]) {
            fill(p);
            add(p);
        }
    }

    if (a > 1) {
        sum *= geometrique(a, b);
        sum %= MOD;
    }

    out << sum;

    return 0;
}