Cod sursa(job #2931026)

Utilizator Teodor94Teodor Plop Teodor94 Data 30 octombrie 2022 11:27:01
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;

#define MOD 9901

#define NO_PRIME_FACTORS 8

int noPrimeFactors;
int prime[NO_PRIME_FACTORS];
int exponent[NO_PRIME_FACTORS];

void desc(int a, int b) {
    int div;

    noPrimeFactors = 0;
    div = 2;
    while (div * div <= a) {
        if (a % div == 0) {
            prime[noPrimeFactors] = div;
            exponent[noPrimeFactors] = 0;

            while (a % div == 0) {
                a /= div;
                exponent[noPrimeFactors] += b;
            }

            ++noPrimeFactors;
        }

        ++div;
    }

    if (a > 1) {
        prime[noPrimeFactors] = a;
        exponent[noPrimeFactors] = b;
        ++noPrimeFactors;
    }
}

int lgPut(int a, int n) {
    a %= MOD;

    int p;

    p = 1;
    while (n) {
        if (n & 1)
            p = p * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }

    return p;
}

inline int invMod(int a) {
    return lgPut(a, MOD - 2);
}

int main() {
    FILE *fin, *fout;
    fin = fopen("sumdiv.in", "r");
    fout = fopen("sumdiv.out", "w");

    int a, b;
    int i, sumDiv;
    fscanf(fin, "%d%d", &a, &b);

    desc(a, b);

    sumDiv = 1;
    for (i = 0; i < noPrimeFactors; ++i)
        if (prime[i] % MOD != 1) {
            sumDiv = sumDiv * (lgPut(prime[i], exponent[i] + 1) + MOD - 1) % MOD;
            sumDiv = sumDiv * invMod(prime[i] - 1) % MOD;
        } else {
            sumDiv = sumDiv * (exponent[i] + 1) % MOD;
        }

    fprintf(fout, "%d\n", sumDiv);

    fclose(fin);
    fclose(fout);
    return 0;
}