Cod sursa(job #2691270)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 27 decembrie 2020 19:47:21
Problema Suma divizorilor Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <stdio.h>
#define MOD 9901

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

long long caca( long long n, long long q )
{
    long long d = 2, p, rez = 1;
    while( n > 1 ){
        p = 0;
        while( n % d == 0 ){
            n /= d;
            ++p;
        }
        if( p > 0 ){
            if( d % MOD == 0 )
                rez = ( ( long long )rez * ( p * n + 1 ) ) % MOD;
            else {
                p *= q;
                ++p;
                long long val = put( d, p );
                if( val % MOD == 0 )
                    val = MOD - 1;
                else --val;
                long long inv = put( d - 1, MOD - 2 );
                rez = ( rez * val * inv) % MOD;
            }
        }
        d += 2;
        if( n > 1 && d * d >= n )
            d = n;
    }
    return rez;
}

int main()
{
    long long n, p;
    FILE *fin = fopen( "sumdiv.in", "r" );
    fscanf( fin, "%lld %lld", &n, &p );
    fclose( fin );
    if( p == 0 )
        n = 1;
    std::ofstream fout( "sumdiv.out" );
    fout << caca( n, p ) << '\n';
    return 0;
}