Cod sursa(job #2690401)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 23 decembrie 2020 21:39:36
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

const int MOD = 9901;

bitset <1000001> prime;
vector <long long> v;
int t;
long long x;

void sieve(){

    v.reserve(78498);
    for(long long i = 3;i * i <= 1000000;i += 2)
        if(!prime[i]){
            for(long long j = i * i;j <= 1000000; j += 2 * i)
                prime[j] = 1;
        }

    v.emplace_back(2);
    for(int i = 3;i <= 1000000;i += 2)
        if(!prime[i]) v.emplace_back(i);
}

long long BinPow(long long a, int b){

    long long res = 1;
    while(b > 0){
        if(b & 1)
            res *= a;
        a *= a;
        b >>= 1;
    }
    return res;
}

void BinSumDiv(long long x, int pw){
    
    int i = 0, N = 78498;
    long long sd = 1;

    while(v[i] * v[i] <= x && i < N){

        int fm = 0;
        while(x % v[i] == 0){
            fm++;
            x /= v[i];
        }

        if(fm){
            long long p = BinPow(v[i], pw * fm + 1);
            sd *= (p - 1) / (v[i] - 1);
        }

        i++;
    }

    if(x != 1) sd *= (BinPow(x, pw + 1) - 1) / (x - 1);

    g << sd % MOD << "\n";
}

int main(){

    sieve();
    int x, y;
    f >> x >> y;
    BinSumDiv(x, y);
}