link to the problem - CodeChef: Practical coding for everyone
int main(void) {
int t,l;
long double fact[51]={1};
scanf("%d",&t);
for(l=1;l<=50;l++)
fact[l]=l*fact[l-1];
while(t--)
{
int i,n,k,a[50],j,np=0,rp=0;
long sum=0;
long double ans=0;
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(&a[0],0,n-1);
i=k-1;
while(i>0 && a[i]==a[i-1])
i--;
rp=k-i;//i will be the starting pos of last unique number
i=k-1;
while(i<(n-1) && a[i]==a[i+1])
i++;
np=rp+(i-(k-1));
ans=fact[np]/(fact[rp]*fact[np-rp]);//calculate this
//printf("%.0Lf ",fact[30]);
printf("%.0Lf\n",ans);
}
return 0;
}
This is the code i tried. Now i know that using double will give precision errors in case of large factorials thus giving wrong factorial values, but to my surprise the solution got accepted for all cases. I want to know why this happened? I mean how the nCr formula produced correct answer even for wrong values of factorial