Cod sursa(job #1062325)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 21 decembrie 2013 02:08:17
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define MAX 50000010
#define MODULUS 9901
using namespace std;

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

int A, B;
long long prime[8000];
long long putere[8000];
int nr_prime=0;

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

    for (int 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(int n) {
    for (int i=0; i<nr_prime; i++) {
        putere[i] *= n;
    }
}

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

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

long long pow(long long x, long long p) {
    long long 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;
}

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

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

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

    factorizeaza(A);
    ridica_la_putere(B);

    int s = 1;
    for (int 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;
}