Cod sursa(job #2691275)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 27 decembrie 2020 20:44:10
Problema Suma divizorilor Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#define MOD 9901

int caca( int a, long long b ) {
    int rez = 1;
    while( b > 0 ){
        if( b % 2 == 1 )
            rez = ( long long )rez * a % MOD;
        a = a * a % MOD;
        b /= 2;
    }
    return rez;
}

int main()
{
    int n, p, d = 2;
    long long e, rez = 1;
    FILE *fin = fopen( "sumdiv.in", "r" );
    fscanf( fin, "%d %d", &n, &p );
    fclose( fin );
    if( p == 0 )
        n = 1;

    while( n > 1 ) {
        e = 0LL;
        while( n % d == 0 ){
            n /= d;
            ++e;
        }
        if( e > 0 ){
            printf( "%d^ %lld\n", d, e );
            if( d % MOD == 1 )
                rez = rez * ( e * p + 1 ) % MOD;
            else {
                e *= p;
                ++e;
                int val = caca( d, e );
                if( val % MOD == 0 )
                    val = MOD - 1;
                else --val;
                int inv = caca( d - 1, MOD - 2 );
                rez = rez * ( long long )inv * val % MOD;
            }
        }
        ++d;
        if( d > 3 )
            ++d;
        if( n > 1 && d * d >= n )
            d = n;
    }
    FILE *fout = fopen( "sumdiv.out", "w" );
    fprintf( fout, "%lld\n", rez );
    fclose( fout );
    return 0;
}