Pagini recente » Cod sursa (job #872161) | Cod sursa (job #769967) | Cod sursa (job #820537) | Cod sursa (job #1033222) | Cod sursa (job #731622)
Cod sursa(job #731622)
#include <fstream>
#include <cmath>
const unsigned short MOD(9901);
inline unsigned int E (unsigned short *p1, unsigned long long *p2)
{
unsigned long long power(*p2 + 1),base(*p1 % MOD),aux1(1);
for (unsigned long long bit(0x01) ; bit <= power ; bit <<= 1)
{
if (power & bit)
{
aux1 *= base;
aux1 %= MOD;
}
base *= base;
base %= MOD;
}
--aux1;
aux1 += MOD;
aux1 %= MOD;
if (!aux1)
return power % MOD;
unsigned long long aux2(1);
power = MOD - 2;
base = *p1 - 1;
base %= MOD;
for (unsigned short bit(0x01) ; bit <= power ; bit <<= 1)
{
if (power & bit)
{
aux2 *= base;
aux2 %= MOD;
}
base *= base;
base %= MOD;
}
return aux1 * aux2 % MOD;
}
int main (void)
{
unsigned int a,b;
std::ifstream input("sumdiv.in");
input >> a >> b;
input.close();
unsigned short primes [10],*prim_ptr(primes);
unsigned long long powers [10],*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 = b;
}
else
{
--prim_ptr;
--pow_ptr;
}
unsigned int result(1);
while (prim_ptr >= primes)
{
result *= E(prim_ptr,pow_ptr);
result %= MOD;
--prim_ptr;
--pow_ptr;
}
std::ofstream output("sumdiv.out");
output << result << '\n';
output.close();
return 0;
}