Pagini recente » Cod sursa (job #2271469) | Cod sursa (job #1593424) | Cod sursa (job #852130) | Cod sursa (job #726339) | Cod sursa (job #1396080)
#include<cstdio>
#define RTT 2000003
#define NRMAX 5005
FILE *f=fopen("sandokan.in","r"), *g=fopen("sandokan.out","w");
long long int N, K, r, NrPrime;
long long int viz[NRMAX], Ciur[700], Fact[700];
void CreareCiur(){
long long int i, j;
NrPrime = 0;
for( i = 2; i <= N-1; i++ )
if( viz[i] == 0 )
{
Ciur[ ++NrPrime ] = i;
for( j = i*2; j <= N-1; j += i )
viz[j] = 1;
}
}
void Adauga( long int A, long int Semn ){
int a, i;
for( i = 1; i <= NrPrime && Ciur[i] <= A; i++ )
{
a = Ciur[i];
while( a <= A )
{
Fact[i] += Semn * ( A / a );
a *= Ciur[i];
}
}
}
long long int Combinari( long long int n, long long int k ){
long long int i, j, R;
Adauga( n, +1 );
Adauga( k, -1 );
Adauga( n-k, -1 );
R = 1;
for( i = 1; Ciur[i] <= n && i <= NrPrime; i++ )
for( j = 1; j <= Fact[i]; j++ )
R = ( R * Ciur[i] ) % RTT;
return R;
}
int main(){
fscanf(f,"%lld %lld\n",&N,&K);
r = N % (K-1);
if( r == 0 )
r = K-1;
CreareCiur();
fprintf(g,"%lld\n", Combinari( N-1, r-1 ) );
return 0;
}