【BZOJ2982】combination

                                        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;   
}

猜你喜欢

转载自blog.csdn.net/m0_38083668/article/details/81605429