Cod sursa(job #1139773)

Utilizator andreiagAndrei Galusca andreiag Data 11 martie 2014 14:23:29
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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 %MOD;
    return (ret * my_pow((n*n) %MOD, p/2)) % MOD;
}

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

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

    ll sumdiv = 1;
    ll factor = 1;
    int e = 0;

    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; 1ll*p*p <= A; p += 2) {
        if (A %p == 0) {
            factor = 1;
            while (A %p == 0) {
                A /= p;
                factor *= p;
                e++;
            }
            if (p % MOD != 1) {
                sumdiv *= 1ll*(my_pow(factor %MOD, B) * (p %MOD) - 1) * my_pow((p-1) %MOD, MOD-2);
                sumdiv %= MOD;
            } else {
                sumdiv = (sumdiv * e * B) %MOD;
            }
        }
    }
    
    if (A > 1) {
        if (A %MOD != 1) {
            sumdiv *= 1ll*(my_pow(A %MOD, B) * (A %MOD) - 1) * my_pow((A-1) %MOD, MOD-2);
            sumdiv %= MOD;
        } else {
            sumdiv = (sumdiv * B) %MOD;
        }
    }
    g << sumdiv << endl;

    return 0;
}