Cod sursa(job #340327)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 14 august 2009 11:41:38
Problema Sandokan Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#define NR 2000003
#define N 5005
int n,k,nr[N],v[N],r,t[N];
long long rez_f=1;
char prim(int x)
{
	if (x==1)
		return 0;
	if (x==2)
		return 1;
	if (x%2==0)
		return 0;
	int i;
	for (i=3; i*i<=x; i+=2)
		if (x%i==0)
			return 0;
	return 1;
}
void calcul()
{
	int i;
	for (i=2; i<=N; i++)
		if (prim(i))
			v[++r]=i;
}
void factorizare(int i,int tip)
{
	int j,rez=0;
	if (tip==1)
	{
		for (j=v[i]; j<=n-1; j*=v[i])
			rez+=(n-1)/j;
		t[v[i]]=rez;
	}
	if (tip==2)
	{
		for (j=v[i]; j<=k-1; j*=v[i])
			rez+=(k-1)/j;
		t[v[i]]-=rez;
	}
	if (tip==3)
	{
		for (j=v[i]; j<=n-k; j*=v[i])
			rez+=(n-k)/j;
		t[v[i]]-=rez;
	}
}
void calcul1()
{
	int i;
	for (i=1; i<=r; i++)
		if (v[i]<=n-1)
			factorizare(i,1);
		else
			break;
	for (i=1; i<=r; i++)
		if (v[i]<=k-1)
			factorizare(i,2);
		else
			break;
	for (i=1; i<=r; i++)
		if (v[i]<=n-k)
			factorizare(i,3);
		else
			break;
}
void calcul2()
{
	int i,j;
	for (i=1; i<=r; i++)
		if (t[v[i]]>0)
			for (j=1; j<=t[v[i]]; j++)
			{
				rez_f=(long long)rez_f*v[i];
				if (rez_f>NR)
					rez_f%=NR;
			}
}
int main()
{
	freopen("sandokan.in","r",stdin);
	freopen("sandokan.out","w",stdout);
	scanf("%d%d",&n,&k);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&nr[i]);
	calcul();
	calcul1();
	calcul2();
	printf("%lld\n",rez_f);
	return 0;
}