Pagini recente » Cod sursa (job #3147138) | Cod sursa (job #1223827) | Cod sursa (job #2842192) | Cod sursa (job #3120929) | Cod sursa (job #1854135)
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream in ("sumdiv.in");
ofstream out ("sumdiv.out");
int const radmax = 8000;
int const modulo = 9901;
bitset<radmax> ciur;
int primes[radmax], nprimes;
int a, b;
void computeciur() {
primes[0] = 2;
nprimes = 1;
for(int i = 3; i <= radmax; i += 2) {
if(ciur[i] == 0) {
primes[nprimes] = i;
nprimes++;
if(1LL * i * i <= radmax) {
int j = i * i;
while (j<=radmax) {
ciur[j] = 1;
j += 2*i;
}
}
}
}
}
void gcd(int &x ,int &y ,int a ,int b){
if(b == 0){
x = 1;
y = 0;
} else{
gcd(x ,y ,b , a % b);
int aux = x;
x = y;
y = aux - a / b * y;
}
}
int logpow(int x, int y) {
if(y == 0)
return 1;
else {
int result = logpow(x, y >> 1);
if((y & 1) == 0)
return (result * result) % modulo;
else
return ((result * result) % modulo * x) % modulo;
}
}
void updatesumformula(int &sumadiv, int p, int d) {
if((p - 1) % modulo == 0){
sumadiv = (sumadiv * (d + 1)) % modulo;
} else{
sumadiv = (sumadiv * (logpow(p % modulo, d + 1) + modulo - 1)) % modulo;
int x ,y;
gcd(x ,y ,p - 1 , modulo);
if(x < 0){
x = modulo + x % modulo;
}
sumadiv = (sumadiv * x) % modulo;
}
}
void descompunere(int n) {
int sumadiv = 1;
int i = 0;
while(i < nprimes && primes[i] * primes[i] <= n) {
if(n % primes[i] == 0){
int npow = 0;
while(n % primes[i] == 0){
n /= primes[i];
npow++;
}
npow *= b;
updatesumformula(sumadiv, primes[i], npow);
}
i++;
}
if(1<n) {
updatesumformula(sumadiv, n % modulo, b);
}
out<<sumadiv % modulo;
}
int main() {
computeciur();
in>>a>>b;
if(a == 0)
out<<0;
else{
descompunere(a);
}
return 0;
}