Cod sursa(job #2706720)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 15 februarie 2021 18:03:13
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 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 = a % MOD;
    while(b > 0){
        if(b & 1)
            res = (res * a) % MOD;
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}

long long diffMOD(long long x, long long y){
	return ((x - y) % MOD + MOD) % MOD;
}
 
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);
            if(p == 1)
            	sd = (sd * (pw * fm + 1)) % MOD;
            else 
            	sd = sd * diffMOD(p, 1) % MOD * BinPow(diffMOD(v[i], 1), MOD - 2) % MOD;
        }
 
        i++;
    }
 
    if(x != 1) {
    	if(x % MOD == 1)
    		sd = (sd * (pw + 1)) % MOD;
    	else
    		sd = sd * diffMOD(BinPow(x, pw + 1), 1) % MOD * BinPow(diffMOD(x, 1), MOD - 2) % MOD;
    }
 
    g << sd << "\n";
}
 
int main(){
 
    sieve();
    int x, y;
    f >> x >> y;
    if (x == 0 && y == 0){
        g << 1;
        return 0;
    }
 
    if(x == 0){
        g << 0;
        return 0;
    }
 
    if(y == 0){
        g << 1;
        return 0;
    }
    
    BinSumDiv(x, y);
}