Pagini recente » Cod sursa (job #511609) | Borderou de evaluare (job #1750644) | Cod sursa (job #3279358) | Cod sursa (job #2898530) | Cod sursa (job #1246888)
#include <fstream>
#include <iostream>
long
dec
( long m
, long x
)
{ // Compute x-1 modulo m.
x += (m-1);
x %= m;
return x;
}
long
exp
( long m
, long x
, long k
)
{ // Compute x**k, modulo m.
x %= m;
long e = 1;
long b = 1;
while(0<k)
{ if(0 != (k & b) )
{ k ^= b;
e *= x;
e %= m;
}
x *= x;
x %= m;
b *= 2;
}
return e;
}
long
div
( long p
, long a
, long b
)
{ // Compute a/b modulo p, where p is a prime number.
long x;
long y;
x = a % p;
y = exp(p, b, p-2);
x *= y;
x %= p;
return x;
}
bool
solveSumdiv
()
{ ::std::ifstream is("sumdiv.in");
long const m = 9901; // a prime number
long A;
long B;
is >> A >> B;
// f(x) = ∑ d ∣ x 😼 d.
// f is multiplicative.
long f = 1;
long p;
for(p=2; 1<A; ++p)
{ if(0 == (A%p) )
{ long k = 0;
while(0 == (A%p) )
{ A /= p;
++k;
}
k *= B;
++k;
long a = dec(m, exp(m, p, k));
long b = dec(m, p);
long c = div(m, a, b);
f *= c;
f %= m;
}
}
::std::ofstream os("sumdiv.out");
os << f << ::std::endl;
return true; // Success.
}
int
main
()
{ int status;
try
{ bool const ok = solveSumdiv();
status = ( ok ? 0 : 1 );
}
catch ( ... )
{ status = 2;
}
return status;
}