Cod sursa(job #1468519)

Utilizator borcanirobertBorcani Robert borcanirobert Data 6 august 2015 11:49:47
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

const int MAXP = 10000;
const int MOD = 9901;
bool ciur[MAXP];
int p[MAXP], np;
int A, B;
int S = 1;

void Prime();
int Power( int a, int n );
void DescompSiSuma();

int main()
{
    Prime();
    fin >> A >> B;
    DescompSiSuma();
    fout << S << '\n';
    fin.close();
    fout.close();
    return 0;
}

void Prime()
{
    int i, j;

    for ( i = 2; i * i < MAXP; i++ )
        if ( !ciur[i] )
        {
            p[++np] = i;
            for ( j = i * 2; j < MAXP; j += i )
                ciur[j] = 1;
        }
    for ( ; i < MAXP; i++ )
        if ( !ciur[i] )
            p[++np] = i;
}

int Power( int a, int n )
{
    int rez = 1;

   // a %= MOD;

    while ( n > 0 )
    {
        if ( n % 2 )
        {
            rez = (1LL * rez * a) % MOD;
            n--;
        }
        a = ( 1LL * a * a ) % MOD;
        n /= 2;
    }

    return rez;
}

void DescompSiSuma()
{
    int d, i;
    int n1, n2;

  //  fout << p[np] << '\n';

    for ( i = 1; p[i] * p[i] <= A && A > 1; i++ )
    {
        if ( A % p[i] )
            continue;

        d = 0;
        while ( A % p[i] == 0 )
            A /= p[i], d++;
        d *= B;

        n1 = ( Power( p[i], d + 1 ) - 1 ) % MOD;
        n2 = Power( p[i] - 1, MOD - 2 ) % MOD;

        S = ( ( ( S * n1 ) % MOD ) * n2 ) % MOD;
    }

    if ( A > 1 )
    {
        d = B;
        n1 = ( Power( A, d + 1 ) - 1 ) % MOD;
        n2 = Power( A - 1, MOD - 2 ) % MOD;

        S = ( ( ( S * n1 ) % MOD ) * n2 ) % MOD;
    }
}