Cod sursa(job #405677)

Utilizator alexandru92alexandru alexandru92 Data 28 februarie 2010 16:54:25
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#define Modulo 9901
#define Nmax 50000000

/*
 *
 */
using namespace std;
typedef long long int lld;
char is_prime[Nmax];
vector< int > Prime;
inline lld pow( lld x, lld n )
{
	if( 2 == x )
		return (1<<n);
	lld r=1;
	for( ; n; n>>=1 )
	{
		if( n&1 )
			r*=x;
		x*=x;
	}
	return r;
}
int main( void )
{
	lld s=1;
	int A, B, N, i, j;
	ifstream in( "sumdiv.in" );
	in>>A>>B;
	if( A <= 1 || 0 == B )
	{
		ofstream out( "sumdiv.out" );
		out<<'1';
		return 0;
	}
	if( 2 == A )
	{
		ofstream out( "sumdiv.out" );
		out<<( (1<<(B+1) )-1 )%Modulo;
		return 0;
	}
	for( i=1; ((i*i)<<1)+(i<<1) <= A; ++i )
		if( 0 == ( is_prime[i>>3] & ( 1<<(i&7) ) ) )
			for( j=((i*i)<<1)+(i<<1); (j<<1)+1 <= A; j+=(i<<1)+1 )
				is_prime[j>>3]|=( 1<<(j&7) );
	Prime.push_back(2);
	for( i=1; (i<<1)+1 <= A; ++i )
		if( 0 == ( is_prime[i>>3] & ( 1<<(i&7) ) ) )
			Prime.push_back( (i<<1)+1 );
	N=Prime.size();
	for( i=0; i < N && 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( 1LL*Prime[i], 1LL*(j*B+1) ) - 1 )/( Prime[i]-1 ) )%Modulo;
		}
	if( A > 1 )
		s=( s * ( pow( 1LL*A, 1LL*(B+1) ) - 1 )/( A-1 ) )%Modulo; 
	ofstream out( "sumdiv.out" );
	out<<s;
	return 0;
}