2982: combination
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1055 Solved: 567
Description
LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值。(1<=m<=n<=200,000,000)
Input
第一行一个整数t,表示有t组数据。(t<=200)
接下来t行每行两个整数n, m,如题意。
Output
T行,每行一个数,为C(n, m) mod 10007的答案。
Sample Input
4
5 1
5 2
7 3
4 2
Sample Output
5
10
35
6
解析:
直接上Lucas。
友情提示:Lucas不要像我这样写!这个代码是最初学Lucas写的,非常不优秀!建议最好预处理出前缀乘与逆元再进行运算!
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=10007;
int t,n,m;
inline int ksm(int a,int b)
{
int ans=1;
a = a % mod;
while(b)
{
if(b&1) ans = (ans * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ans % mod;
}
inline int C(int n,int m)
{
int a = 1,b = 1;
for(int i=n-m+1;i<=n;i++) a = a * i % mod;
for(int i=2;i<=m;i++) b = b * i % mod;
return a * ksm(b,mod-2) % mod;
}
inline int Lucas(int n,int m)
{
if(!m) return 1;
else return (C(n%mod,m%mod) * Lucas(n/mod,m/mod)) % mod;
}
signed main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
cout<<Lucas(n,m) % mod<<"\n";
}
return 0;
}