Cod sursa(job #2658007)

Utilizator vladm98Munteanu Vlad vladm98 Data 12 octombrie 2020 21:18:05
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cassert>

using namespace std;
int MOD = 9901;
bool isPrime[10001];
int prime[10001];

long long expBySq (long long a, long long b) {
    long long rez = 1;
    while (b != 0) {
        if (b % 2 == 0) {
            a = (a * a) % MOD;
            b = b / 2;
        }
        else {
            rez = (rez * a) % MOD;
            a = (a * a) % MOD;
            b = (b - 1) / 2;
        }
    }
    return rez;
}

int main()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    int e = 10000, primeCount = 0;

    isPrime[0] = isPrime[1] = 1;
    for (int i = 2; i <= e; ++i) {
        if (isPrime[i] == 0) {
            primeCount += 1;
            prime[primeCount] = i;
            for (int j = 2 * i; j <= e; j += i) {
                isPrime[j] = 1;
            }
        }
    }

    int A, B;
    fin >> A >> B;

    long long sum = 1, newProduct;
    for (int i = 1; i <= primeCount && 1LL * prime[i] * prime[i] <= A; ++i) {
            long long product = 1;
            while (A % prime[i] == 0) {
                   A = A / prime[i];
                   product *= prime[i];
            }
            newProduct = (prime[i] * expBySq(product, B)) % MOD;
            sum = (sum * (newProduct - 1) * expBySq(prime[i] - 1, MOD - 2)) % MOD;
    }
    if (A > 1) {
        newProduct = expBySq(A, B + 1);
        sum = (sum * (newProduct - 1) * expBySq(A - 1, MOD - 2)) % MOD;
    }
    if (sum < 0) sum += MOD;
    fout << sum;

    return 0;
}