Lightoj 题目1067 Combinations(lucas)

来源:互联网 发布:苏州大学本部淘宝地址 编辑:程序博客网 时间:2024/06/10 15:11
C - Combinations
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit Status Practice LightOJ 1067

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代码

6110862015-11-09 14:27:541067 - CombinationsC++0.0289500

Accepted

#include<stdio.h>#include<iostream>#include<algorithm>#include<stdlib.h>#include<map>#include<math.h>#define LL long longusing 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));}}


0 0
原创粉丝点击