Pagini recente » Cod sursa (job #410620) | Cod sursa (job #639569) | Cod sursa (job #1389675) | Cod sursa (job #1142379) | Cod sursa (job #2107090)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#define M 9901
uint64_t modexp(uint64_t x, uint64_t n);
int main(void)
{
FILE *in = fopen("sumdiv.in", "r");
FILE *out = fopen("sumdiv.out", "w");
if(in != NULL && out != NULL)
{
uint64_t a, b;
fscanf(in, "%llu%*c%llu%*c", &a, &b);
uint64_t facts[10000], powers[10000], d = 2, n = a, idx = 0;
while(n > 1)
{
uint64_t p = 0;
while(n % d == 0)
{
p++;
n /= d;
}
if(p)
{
facts[idx] = d;
powers[idx] = p;
idx++;
}
d++;
if(n > 1 && d * d > n)
{
d = n;
}
}
d = 0;
for(; d < idx; d++)
{
powers[d] = ((powers[d] % M) * (b % M)) % M;
}
uint64_t res = 1;
d = 0;
for(; d < idx; d++)
{
uint64_t s = 1;
uint64_t i = 1;
for(; i <= powers[d]; i++)
{
s = ((s % M) + (modexp(facts[d], i) % M)) % M;
}
res = ((res % M) * (s % M)) % M;
}
printf("%llu\n", res);
fclose(in);
fclose(out);
}
else
{
printf("file error\n");
}
return 0;
}
uint64_t modexp(uint64_t x, uint64_t n)
{
uint64_t res = 1;
while(n)
{
if(n % 2 != 0)
{
res = ((res % M) * (x % M)) % M;
}
x = ((x % M) * (x % M)) % M;
n /= 2;
}
return res;
}