Cod sursa(job #1458600)

Utilizator roadtojediWilly Fog roadtojedi Data 8 iulie 2015 00:48:05
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 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)
    {
        if(a %MOD == 1)
        {

                    prod = (prod * ((b + 1) % MOD)) % MOD;
        }
        else
            prod = getmod( prod%MOD * getmod(getmod(getpow(a, b + 1) - 1) * getmod(getpow(a-1, MOD - 2))));
    }
    g<<prod;
}