Pagini recente » Cod sursa (job #1047117) | Cod sursa (job #2374278) | Cod sursa (job #3201995) | Cod sursa (job #1745402) | Cod sursa (job #340327)
Cod sursa(job #340327)
#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;
}