Cod sursa(job #2666866)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 2 noiembrie 2020 16:04:45
Problema Suma divizorilor Scor 80
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#define MOD 9901
#define MAX_D 7100
int ciur[MAX_D + 1], prime[MAX_D];
int lgput( int a, int e ) {
    int r;
    if ( e == 0 )
        return 1;
    r = lgput( a, e / 2 );
    r = (long long)r * r % MOD;
    if ( e % 2 == 1 )
        r = (long long)r * a % MOD;
    return r;
}
int main() {
    FILE *fin, *fout;
    int a, b, sumaDiv, e, nrp, d, i, j;
    nrp = 0;
    for ( i = 2; i <= MAX_D; i++ ) {
        if ( ciur[i] == 0 ) {
            prime[nrp] = i;
            nrp++;
            for ( j = i * i; j * j <= MAX_D; j++ )
                ciur[i] = 1;
        }
    }
    fin = fopen( "sumdiv.in", "r" );
    fscanf( fin, "%d%d", &a, &b );
    fclose( fin );
    sumaDiv = 1;
    d = 0;
    while ( prime[d] * prime[d] <= a ) {
        e = 0;
        while ( a % prime[d] == 0 ) {
            a /= prime[d];
            e++;
        }
        e *= b;
        if ( e > 0 ) {
            if ( prime[d] % MOD == 1 )
                sumaDiv = (long long)sumaDiv * (e + 1) % MOD;
            else
                sumaDiv = ((long long)sumaDiv * (lgput( prime[d], e + 1 ) - 1 + MOD)) % MOD * lgput( prime[d] - 1, MOD - 2 ) % MOD;
        }
        d++;
    }
    if ( a > 1  ) {
        if ( a % MOD == 1 )
            sumaDiv *= (long long)sumaDiv * (b + 1) % MOD;
        else
            sumaDiv = ((long long)sumaDiv * (lgput( a, b + 1 ) - 1 + MOD)) % MOD * lgput( a - 1, MOD - 2 ) % MOD;
    }
    fout = fopen( "sumdiv.out", "w" );
    fprintf( fout, "%d", sumaDiv );
    fclose( fout );
    return 0;
}