Pagini recente » Cod sursa (job #1685124) | Cod sursa (job #596437) | Istoria paginii runda/test321 | Cod sursa (job #2122258) | Cod sursa (job #405698)
Cod sursa(job #405698)
#include <vector>
#include <fstream>
#include <cstdlib>
#define Modulo 9901
#define Nmax 10007
/*
*
*/
using namespace std;
typedef long long int lld;
char is_prime[Nmax/16+1];
vector< int > Prime;
void Sieve( void )
{
unsigned int i, j;
for( i=1; ( (i*i)<<1 )+(i<<1) <= Nmax; ++i )
if( 0 == ( is_prime[i>>3] & ( 1<<(i&7) ) ) )
for( j=((i*i)<<1)+(i<<1); (j<<1)+1 <= Nmax; j+=(i<<1)+1 )
is_prime[j>>3]|=(1<<(j&7));
Prime.push_back(2);
for( i=1; (i<<1)+1 <= Nmax; ++i )
if( 0 == ( is_prime[i>>3] & ( 1<<(i&7) ) ) )
Prime.push_back( (i<<1)+1 );
}
inline lld pow( lld x, lld n )
{
lld r=1;
for( ; n; n>>=1 )
{
if( n&1 )
r*=x;
x*=x;
}
return r;
}
int main( void )
{
lld A, B, i, j, s=1;
ifstream in( "sumdiv.in" );
in>>A>>B;
Sieve();
for( i=0; 1LL*Prime[i]*Prime[i] <= A; ++i )
if( 0 == A%Prime[i] )
{
for( j=0; 0 == A%Prime[i]; ++j, A/=Prime[i] );
s=( s* ( pow( Prime[i], j*B+1 )-1 )/( Prime[i]-1 ) )%Modulo;
}
if( A > 1 )
s=( s*(pow( A, B+1 )-1 )/( A-1 ) )%Modulo;
ofstream out( "sumdiv.out" );
out<<s;
return 0;
}