Cod sursa(job #2657990)

Utilizator zarg169Roxana zarg169 Data 12 octombrie 2020 20:44:18
Problema Suma divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

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

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 = 1000000, 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 = expBySq(product, B + 1) - 1;
            sum = (sum * newProduct * expBySq(product - 1, MOD - 2)) % MOD;
    } if (A > 1) {
        newProduct = expBySq(A, B + 1) - 1;
        sum = (sum * newProduct * expBySq(A - 1, MOD - 2)) % MOD;
    }
    fout << sum << " ";

    return 0;
}