Cod sursa(job #1062321)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 21 decembrie 2013 01:48:25
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define MAX 50000010
#define MODULUS 9901
#define ll long long
using namespace std;

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

ll A, B;
ll prime[8000];
ll putere[MAX];
ll nr_prime=0;

ll factorizeaza(ll n) {
    ll nr, t, nn = -1;

    for (ll i=2, sq=sqrt(n); i<=sq; i++) {
        nr = 0;
        while (n%i==0) {
            n /= i;
            nr++;
        }
        if (nr>0) {
            prime[nr_prime] = i;
            putere[nr_prime] = nr;
            nr_prime++;
        }
    }
    if (n>1) {
        prime[nr_prime] = n;
        putere[nr_prime] = 1;
        nr_prime++;
    }
}

void ridica_la_putere(ll n) {
    for (ll i=0; i<nr_prime; i++) {
        putere[i] *= n;
    }
}

ll euclid(ll x, ll y, ll *a, ll *b) {
    if (y==0) {
        *a = 1;
        *b = 0;
        return x;
    } else {
        ll ap, bp;
        ll d = euclid(y, x%y, &ap, &bp);

        *a = bp;
        *b = (MODULUS + ap - ((long long)(*a)*((long long)(x/y) % MODULUS)) ) % MODULUS;
        return d;
    }
}

ll pow(ll x, ll p) {
    ll rez = 1, t = x;
    while (p > 0) {
        if (p%2==1) {
            rez *= t;
            if (rez >= MODULUS) rez %= MODULUS;
        }
        t *= t;
        if (t >= MODULUS) t %= MODULUS;
        p /= 2;
    }
    return rez;
}

ll inv(ll x) {
    ll a, b;
    ll d = euclid(x, MODULUS, &a, &b);
    return a;
}

int main()
{
    f >> A >> B;

//    euclid(A, B, &B, &A);

    factorizeaza(A);
    ridica_la_putere(B);

    ll s = 1;
    for (ll i=0; i<nr_prime; i++) {
//        cout << prime[i] << ' ' << putere[i] << endl;
        s = (s * (pow(prime[i], putere[i]+1) - 1)) % MODULUS;
        s = (s * inv(prime[i] - 1)) % MODULUS;
    }

    g << s;

    return 0;
}