Cod sursa(job #1607718)

Utilizator razvandRazvan Dumitru razvand Data 21 februarie 2016 15:46:00
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define r 9901

using namespace std;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
int a,b;

long long powF(long long a, long long b, long long i) {
    if(b == 0)
        return 1;
    if(b == 1)
        return a%r;
    if(b == 2)
        return (a*i)%r;
    if(b % 2 == 0) {
        long long p = powF(a, b/2, i)%r;
        return (p * p)%r;
    } else {
        return ((powF(a, b-1, i))%r * i)%r;
    }
}

long long fact(long long x) {

    long long sum = 1;
    int div = 0;
    int am = 0;

    while(x%2==0) {
        x /= 2;
        div = 2;
        am++;
    }
    if(div != 0) {
        long long temp = powF(div, am*b+1, div)-1;
        long long temp2 = div-1;
        sum *= temp/temp2;
        sum %= r;
        div = 0;
        am = 0;
    }

    for(int i = 3; i <= x; i += 2) {
        while(x%i == 0) {
            div = i;
            am++;
            x /= i;
        }
        if(div != 0) {
            long long temp = powF(div, am*b+1, div)-1;
            long long temp2 = div-1;
            sum *= temp/temp2;
            sum %= r;
            div = 0;
            am = 0;
        }
    }

    return sum%r;

}

int main() {

    in >> a >> b;
    out << fact(a);

    return 0;
}