Pagini recente » Cod sursa (job #210241) | Cod sursa (job #143210) | Cod sursa (job #153738) | Cod sursa (job #3265379) | Cod sursa (job #3289154)
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
const int mod = 9901;
/// vreau sa retin factorul prim si puterea la care apare
vector<int> prime;
vector<int> puteri;
inline void descompune( LL x )
{
LL cnt;
for( LL i = 2; i * i <= x; ++i )
if( x % i == 0 )
{
prime.push_back( i );
cnt = 0;
while( x % i == 0 )
{
x = x / i;
++cnt;
}
puteri.push_back( cnt );
}
if( x > 1 ) /// Termin chiar cu un factor prim
prime.push_back( x ), puteri.push_back( 1 );
}
inline LL exponentiere_rapida( LL A, LL B )
{
LL rasp = 1;
while( B != 0 )
{
if( B & 1 )
rasp = (rasp * A) % mod;
A = (A * A) % mod;
B = (B >> 1);
}
return rasp;
}
/// Atentie, exista supradepasire a tipului de date! De ce esueaza pt valori mari ale lui B?
/// Explicati-va expresiile matematice.
/// Faceti modificarile necesare (CAT MAI PUTINE!) ca sa va dea raspunsul corect!
int main()
{
freopen("sumdiv.in", "r", stdin);
freopen("sumdiv.out","w", stdout);
LL A, B, rasp = 1;
cout << "A = "; cin >> A;
cout << "B = "; cin >> B;
descompune( A );
int d = prime.size(), i;
for( i = 0; i < d; ++i )
{
puteri[ i ] = B * puteri[ i ];
if( (prime[i] - 1 ) % mod == 0 )
rasp = rasp * (puteri[i] + 1) % mod;
else
{
LL termen1 = ( exponentiere_rapida(prime[i], puteri[i] * B - 1) - 1 ) % mod;
LL termen2 = ( prime[ i ] - 1 ) % mod;
rasp *= termen1 / termen2;
rasp %= mod;
}
}
cout << rasp;
return 0;
}