LightOJ1067 Combinations Lucas定理裸题

来源:互联网 发布:安卓 网络加速器 编辑:程序博客网 时间:2024/05/16 01:47

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

模板题。

#include <iostream>#include <cstdio>#include <map>#include <set>#include <vector>#include <queue>#include <stack>#include <cmath>#include <algorithm>#include <cstring>#include <string>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;#define maxn 1000005#define mod 1000003LL f[maxn];void init(LL p){    LL i;    f[0]=1;    for(i=1;i<=p;i++){        f[i]=f[i-1]*i%p;    }}LL powmod(LL a,LL b,LL p) {    LL res=1;    while(b!=0){        if(b&1) res=(res*a)%p;        a=(a*a)%p;        b>>=1;    }    return     res;}LL Lucas(LL n,LL m,LL p){    LL ans=1;    while(n&&m){        LL nn=n%p,mm=m%p;        if(nn<mm) return 0;        ans=ans*f[nn]*powmod(f[mm]*f[nn-mm]%p,p-2,p)%p;        n/=p;        m/=p;    }    return ans;}int main() {    LL a,b;    int t;    init(mod);    scanf("%d",&t);    for(int i=1;i<=t;i++){        scanf("%lld%lld",&a,&b);        printf("Case %d: %lld\n",i,Lucas(a,b,mod));    }    return 0;}


0 0