Pagini recente » Cod sursa (job #2770990) | Cod sursa (job #2665832) | Cod sursa (job #2749741) | Cod sursa (job #114832) | Cod sursa (job #731560)
Cod sursa(job #731560)
#include <fstream>
#include <cmath>
int main (void)
{
unsigned int a,b;
std::ifstream input("sumdiv.in");
input >> a >> b;
input.close();
unsigned short primes [15],*prim_ptr(primes);
unsigned int powers [15],*pow_ptr(powers),aux(a);
if (!(a && b))
{
std::ofstream output("sumdiv.out");
output << (a ? '1' : '0') << '\n';
output.close();
return 0;
}
if (!(a % 2))
{
*prim_ptr = 2;
++prim_ptr;
*pow_ptr = 1;
a >>= 1;
while (!(a % 2))
{
a >>= 1;
++*pow_ptr;
}
*pow_ptr *= b;
++pow_ptr;
}
for (unsigned short i(3), limit(std::sqrt(aux)) ; i <= limit ; i += 2)
{
if (!(a % i))
{
*prim_ptr = i;
++prim_ptr;
*pow_ptr = 1;
a /= i;
while (!(a % i))
{
a /= i;
++*pow_ptr;
}
*pow_ptr *= b;
++pow_ptr;
}
}
if (a != 1)
{
*prim_ptr = a;
*pow_ptr = 1;
}
else
{
--prim_ptr;
--pow_ptr;
}
unsigned long long result(1),e;
const unsigned short MOD(9901);
unsigned int power,base;
unsigned int bit;
while (prim_ptr >= primes)
{
base = *prim_ptr;
power = *pow_ptr + 1;
e = 1;
for (bit = 0x01 ; bit <= power ; bit <<= 1)
{
if (bit & power)
e *= base;
base *= base;
if (e > MOD)
e %= MOD;
if (base > MOD)
base %= MOD;
}
--e;
if (e > MOD)
e %= MOD;
e /= *prim_ptr - 1;
result *= e;
--prim_ptr;
--pow_ptr;
}
std::ofstream output("sumdiv.out");
output << result % MOD << '\n';
output.close();
return 0;
}