Cod sursa(job #168920)

Utilizator MirageRobert Sandu Mirage Data 31 martie 2008 21:11:59
Problema Sandokan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#define N 2000003
int main () {
	freopen("sandokan.in","r",stdin);
	freopen("sandokan.out","w",stdout);
	int n,k,v[5000],i,p=1,j,aprim[5000],bprim[5000],cn,ck,q=0;
	scanf("%d%d",&n,&k);
	/*for(i=0;i<n;++i)
		scanf("%d",&v[i]);*/
	i=0;
	--n;--k;
	for(i=0;i<=n;++i)
		aprim[i]=bprim[i]=1;
	for(i=2;i<=n;++i)
        if(aprim[i])
            for(j=i+i;j<=n;j+=i)
                aprim[j]=bprim[j]=0;
	if(k<n-k){
		cn=n;
		ck=k;
		while(k){
			++q;
			for(i=2;i<=cn;++i)
				while(!(n%i)){
					n/=i;
					++aprim[i];
				}
			for(i=2;i<=ck;++i)
				while(!(k%i)){
					k/=i;
					++bprim[i];
				}
			n=cn-q;
			k=ck-q;
		}
	}
	else{
		cn=n;
		ck=n-k;
		k=n-k;
		while(k<n){
			++q;
			for(i=2;i<=cn;++i)
				while(!(n%i)){
					n/=i;
					++aprim[i];
				}
			for(i=2;i<=ck;++i)
				while(!(k%i)){
					k/=i;
					++bprim[i];
				}
			n=cn-q;
			k=ck-q;
		}
	}
	for(i=2;i<=cn;++i){
		if(bprim[i]>1)
			aprim[i]-=bprim[i];
		if(bprim[i]==1)
			--aprim[i];
	}
	for(i=2;i<=cn;++i)
		while(aprim[i]>=1){
			p=((p%N)*(i%N))%N;
			--aprim[i];
		}
	printf("%d\n",p);
	return 0;
}