Cod sursa(job #405606)

Utilizator alexandru92alexandru alexandru92 Data 28 februarie 2010 13:30:01
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#define Modulo 9901

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