Cod sursa(job #164000)

Utilizator savimSerban Andrei Stan savim Data 23 martie 2008 13:28:48
Problema Sandokan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <math.h>
int i,j,k,n,m,d,x;
int a[5010],prim[5010],na[5010];
long long comb(int p, int q)
{
	m=0;
	for (i=2; i<=p; i++)
	{
		int gas=1;
		for (d=2; d<=sqrt(i); d++)
			if (i%d==0) 
            { 
               gas=0;
               break;
            }
   
		if (gas)
		{
			m++;
			prim[m]=i;
		}
	}

	//calculez p!/q! = (q+1) * (q+2) * ... * p
	for (i=q+1; i<=p; i++)
	{
        k=i;
        for (j=1; j<=m; j++)
        if (k>1)
        {
			while (k%prim[j]==0)
			{
				k/=prim[j];
				na[j]++;
			}
		}
		else break;
    }
	//impart la (p-q)!
	for (i=2; i<=p-q; i++)
	{
        k=i;
        for (j=1; j<=m; j++)
	    if (k>1)
    	{
			while (k%prim[j]==0)
			{
				k/=prim[j];
				na[j]--;
			}
		}
		else break;
     }

	long long sol=1;
	for (i=1; i<=m; i++)
		for (j=1; j<=na[i]; j++)
			sol=(sol*prim[i])%2000003;

	return sol;
}
int main()
{
    freopen("sandokan.in","r",stdin);
    freopen("sandokan.out","w",stdout);

    scanf("%d %d",&n,&k);

	d=n%(k-1);
    if (d==0) d=k-1;
    
	long long sol=comb(n-1,d-1);

    printf("%lld\n",sol);
    
    return 0;
}