Cod sursa(job #1139736)

Utilizator andreiagAndrei Galusca andreiag Data 11 martie 2014 13:54:34
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>

using namespace std;
typedef long long ll;

const int MOD = 9901;
int A, B;

int my_pow(int n, int p) // calculeaza (n**p) % MOD;
{
    if (p == 0) return 1;
    int ret = 1;
    if (p%2==1) ret = n;
    return (ret * my_pow((n*n) %MOD, p/2)) % MOD;
}

int main()
{
    ifstream f ("sumdiv.in");
    ofstream g ("sumdiv.out");

    f >> A >> B;
    if (A == 0) {g << 0 << endl; return 0;}

    ll sumdiv = 1;
    int factor = 1;

    if (A%2 == 0) {
        factor = 1;
        while (A%2 == 0) {
            A /= 2;
            factor *= 2;
        }
        sumdiv = (my_pow(factor %MOD, B) * 2 - 1) %MOD;
    }

    for (int p = 3; p*p <= A; p += 2) {
        if (A % p == 0) {
            factor = 1;
            while (A%p == 0) {
                 A /= p;
                factor *= p;
            }
            sumdiv *= (my_pow(factor %MOD, B) * p - 1) * my_pow((p-1) %MOD, MOD-2);
            sumdiv %= MOD;
        }
    }
    
    if (A > 1) {
        sumdiv *= (my_pow(A %MOD, B) * A - 1) * my_pow((A-1) %MOD, MOD-2);
        sumdiv %= MOD;
    }

    g << sumdiv << endl;

    return 0;
}