Cod sursa(job #2657976)

Utilizator vladm98Munteanu Vlad vladm98 Data 12 octombrie 2020 19:57:47
Problema Suma divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cassert>

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

long long expBySq(long long x, long long n) {
    if (n == 0) {
        return 1;
    } else if (n % 2 == 0) {
        return expBySq((x * x) % MOD, n / 2);
    } else {
        return (x * expBySq((x * x) % MOD, (n - 1) / 2)) % MOD;
    }
}

int main()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    int e = 100000, 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;
    }
    assert(sum >= 0);
    fout << sum;

    return 0;
}