Cod sursa(job #167228)

Utilizator swift90Ionut Bogdanescu swift90 Data 29 martie 2008 11:25:26
Problema Sandokan Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#define rest 2000003
char p[5100];
int prim[2000],put[2000];
void ver1(int i){
	int i1=i,j=0;
	while(i>1 && prim[j]<=i1){
		while(i%prim[j]==0){
			i/=prim[j];
			++put[j];
		}
		++j;
	}
}
void ver2(int i){
	int i1=i,j=0;
	while(i>1 && prim[j]<=i1){
		while(i%prim[j]==0){
			i/=prim[j];
			--put[j];
		}
		++j;
	}
}
int main(){
	freopen("sandokan.in","r",stdin);
	freopen("sandokan.out","w",stdout);
	int n,k,i,j,x;
	long long sum=1;
	scanf("%d%d",&n,&k);
	for(i=4;i<=5050;i+=2)
		p[i]=1;
	for(i=3;i<=5050;i+=2){
		if(p[i]==0)
			for(j=i*i;j<=5000;j+=i)
				p[j]=1;
	}
	prim[0]=2;
	j=1;
	for(i=3;i<=5050;i+=2){
		if(p[i]==0)
			prim[j++]=i;
	}
	x=j;
	
	for(i=n-k+1;i<n;++i)
		ver1(i);
	for(i=2;i<k;++i)
		ver2(i);
	
	for(i=0;i<x;++i){
		while(put[i]){
			sum=(sum*prim[i])%rest;
			--put[i];
		}
	}
	printf("%lld\n",sum);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}