Description
Given n different objects, you want to take k of them. How many ways to can do it?
For example, say there are 4 items; you want to take 2 of them. So, you can do it 6 ways.
Take 1, 2
Take 1, 3
Take 1, 4
Take 2, 3
Take 2, 4
Take 3, 4
Input
Input starts with an integer T (≤ 2000), denoting the number of test cases.
Each test case contains two integers n (1 ≤ n ≤ 106), k (0 ≤ k ≤ n).
Output
For each case, output the case number and the desired value. Since the result can be very large, you have to print the result modulo 1000003.
Sample Input
3
4 2
5 0
6 4
Sample Output
Case 1: 6
Case 2: 1
Case 3: 15
组合数取余
ac代码
611086 | 2015-11-09 14:27:54 | 1067 - Combinations | C++ | 0.028 | 9500 |
Accepted
|
---|
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<map>
#include<math.h>
#define LL long long
using namespace std;
LL fac[1000005];
void get_fact(LL p)
{
fac[0]=1;
for(int i=1;i<=p;i++)
fac[i]=(fac[i-1]*i)%p;
}
LL qpow(LL a,LL b,LL mod)
{
LL ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
LL lucas(LL n,LL m,LL mod)
{
LL ans=1;
while(n&&m)
{
LL a=n%mod;
LL b=m%mod;
if(a<b)
return 0;
ans=(ans*fac[a]*qpow(fac[b]*fac[a-b]%mod,mod-2,mod))%mod;
n/=mod;
m/=mod;
}
return ans;
}
int main()
{
int t,c=0;
scanf("%d",&t);
get_fact(1000003);
while(t--)
{
LL n,m,p;
scanf("%lld%lld",&n,&m);
printf("Case %d: %lld\n",++c,lucas(n,m,1000003));
}
}