Cod sursa(job #2666949)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 2 noiembrie 2020 17:33:12
Problema Suma divizorilor Scor 80
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.78 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 += i )
                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 * ((long long)e + 1) % MOD;
            else {
                sumaDiv = ((long long)sumaDiv * (lgput( prime[d] % MOD, e + 1 ) - 1 + MOD)) % MOD;
                sumaDiv = (long long)sumaDiv * lgput( (prime[d] % MOD + MOD - 1) % MOD, MOD - 2 ) % MOD;
            }
        }
        d++;
    }
    if ( a > 1  ) {
        if ( a % MOD == 1 )
            sumaDiv *= (long long)sumaDiv * ((long long)b + 1) % MOD;
        else {
            sumaDiv = ((long long)sumaDiv * (lgput( a % MOD, b + 1 ) - 1 + MOD)) % MOD;
            sumaDiv = (long long)sumaDiv * lgput( (a % MOD + MOD - 1) % MOD, MOD - 2 ) % MOD;
        }
    }
    if ( a == 0 )
        sumaDiv = 0;
    fout = fopen( "sumdiv.out", "w" );
    fprintf( fout, "%d", sumaDiv );
    fclose( fout );
    return 0;
}