Cod sursa(job #1458562)

Utilizator roadtojediWilly Fog roadtojedi Data 7 iulie 2015 21:52:53
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
//SumDiv
#include <iostream>
#include <fstream>
#include <bitset>
#include <cmath>
using namespace std;

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

const int MOD = 9901;

int getpow(long long int a,long long  int b)
{
    if(b == 1)
    {
        return a % MOD;
    }
    if(b%2 == 0)
    {
        return getpow((a%MOD * a%MOD)%MOD, b/2)% MOD;
    }
    else if( b % 2 == 1)
    {
        return (getpow((a%MOD * a%MOD)%MOD, b/2) % MOD   * (a % MOD )) % MOD;
    }

}

int getmod(int a)
{
    a = a % MOD;
    if( a < 0)   a = a + MOD;
    return a;
}

int main()
{
    int a, b, i;
    f>>a>>b;
    if(a == 0)
    {
        g<<"0";
        return 0;
    }
    int prod = 1;
    for(i = 2; 1LL * i * i <= a; i++)
    {
        if(a % i == 0)
        {
            int k = 0;
            while(a % i == 0)
            {
                a = a/ i;
                k++;
            }
            // Pot face MOD -2 pentru a afla inversul modular ( Mica Teorema a lui Fermat )
            prod = getmod(prod%MOD * getmod((getmod(getpow(i, b*k + 1) - 1) * getmod(getpow(i-1, MOD - 2)))));
        }
    }
    if(a > 1)
    {
            prod = getmod( prod%MOD * getmod(getmod(getpow(a, b + 1) - 1) * getmod(getpow(a-1, MOD - 2))));
    }
    g<<prod;
}