Cod sursa(job #2703043)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 6 februarie 2021 20:16:34
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 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, long long b){
 
    long long res = 1;
    a %= MOD;
    while(b > 0){
        if(b & 1)
            res = (res * a) % MOD;
        a = (a * a) % MOD;
        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 = sd * ((p - 1 + MOD) * BinPow(v[i] - 1, MOD - 2) % MOD) % MOD;
        }
 
        i++;
    }
 
    if(x != 1) sd = sd * ((BinPow(x, pw + 1) - 1 + MOD) * BinPow(x - 1, MOD - 2) % MOD) % MOD;
 
    g << sd << "\n";
}
 
int main(){
 
    sieve();
    int x, y;
    f >> x >> y;
    BinSumDiv(x, y);
}