Cod sursa(job #756239)

Utilizator SpiderManSimoiu Robert SpiderMan Data 9 iunie 2012 12:43:26
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.52 kb
# include <cstdio>

const char FIN[] = "sumdiv.in", FOU[] = "sumdiv.out";
const int MOD = 9901, MAX = 10005;

int P[MAX];
int A, B, S = 1;
unsigned char V[1 << 17];

void prec ()
{
    int n = 0;

    P[++n] = 2;

    for (int i = 3; i < MAX; i += 2)
    {
        if (V[i >> 4] & (1 << ((i >> 1) & 7))) continue; // = daca (V[i] == 1)

        P[++n] = i;                                      // introducem pe i ca numar prim

        for (int j = i + (i << 1); j < MAX; j += i << 1)
            V[j >> 4] |= 1 << ((j >> 1) & 7);            // V[j] = 1;
    }
}

inline int pwlg ( int n , int p )
{
    int sol = 1;

    n %= MOD ;

    for ( int i = 0; 1 << i <= p; ++i )
    {
        if ( 1 << i & p )
            sol *= n,  sol %= MOD;

        n *= n , n %= MOD;
    }

    return sol;
}

inline int check ( int n , int p )
{
    if ( n % MOD == 1 )
        return p * B + 1;

    return ( pwlg ( n , (long long) p * B + 1 ) + MOD - 1 ) * ( pwlg ( n - 1 , MOD - 2 ) ) % MOD;
}

int main()
{
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d %d", &A, &B ) ;

    int AUX = A;

    prec () ;

    for ( int i = 1, p = 0; P[i] * P[i] <= A ; ++i)
        if ( A % P[i] == 0 )
        {
            for ( p = 0 ; AUX % P[i] == 0 ; AUX /= P[i], ++p ) ;

            if ( p )
                S *= check ( P[i] , p ) , S %= MOD ;
        }

    if ( AUX > 1 )
        S *= check ( AUX , 1 ) , S %= MOD ;

    printf ( "%d", S ) ;

    return 0;
}