G - Combinations
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
InputInput 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).
OutputFor 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 Input3
4 2
5 0
6 4
Sample OutputCase 1: 6
Case 2: 1
Case 3: 15
這題 給出a,b求 a,b的組合數mod1000003 我是先用fac打表fac[i]表示i的階乘%1000003的結果,用inv【i】表示i的階乘%1000003的乘法逆元;最後用組合公式即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e6+3;
const int maxn=1e6+100;
LL fac[maxn],inv[maxn];
LL Pow(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{
int cas=1;
int n,a,b;
fac[0]=inv[0]=1;
for(int i=1;i<=1000000;i++)
{
fac[i]=(fac[i-1]*i)%mod;
inv[i]=Pow(fac[i],mod-2);
}
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
LL ans=fac[a]*inv[b]%mod*inv[a-b]%mod;
printf("Case %d: %lld\n",cas++,ans);
}
return 0;
}
人一我百!人十我萬!永不放棄~~~懷着自信的心,去追逐夢想。