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
题意:
算组合数C(k,n)
第一次接触数论的题目
应该算是一个lucas的模版题
里面用到了逆元 用费马小定理算的 n的关于mod逆元等于n的mod-2次方
先阶乘打表 然后求出逆元
lucas:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
using namespace std;
const long long mod=1e6+3;
long long nc[mod];
void initial()//n!
{
nc[0]=1;
for (int i=1 ; i<mod ; i++)
nc[i]=(nc[i-1]*i)%mod;
}
long long pow(long long n,long long m)//快速幂
{
n%=mod;
long long res=1;
while (m)
{
if(m&1)
res=res*n%mod;
n=n*n%mod;
m>>=1;
}
return res;
}
long long C(long long n,long long k,long long m)
{
return nc[n]*pow(nc[k]*nc[n-k],m-2)%m;// n^(mod-2) 是n的逆元
}
long long lucas(long long n,long long k,long long m)//lucas 递归版
{
if (!k || !n)
return 1;
return lucas(n/m,k/m,m)*C(n%m,k%m,m)%m;
}
int main()
{
initial();
int T;
long long n,k;
scanf("%d",&T);
for (int test=1 ; test<=T ; test++)
{
scanf("%lld%lld",&n,&k);
printf("Case %d: %lld\n",test,lucas(n,k,mod));
}
return 0;
}