1656:Combination
一本通1656:Combination
1656:Combination
时间限制: 1000 ms 内存限制: 524288 KB
提交数: 89 通过数: 49
【题目描述】
原题来自:BZOJ 2982
LMZ 有 n
个不同的基友,他每天晚上要选 m 个进行 [河蟹],而且要求每天晚上的选择都不一样。那么 LMZ 能够持续多少个这样的夜晚呢?当然,LMZ 的一年有 10007 天,所以他想知道答案 mod10007
的值。
【输入】
第一行一个整数 t
,表示有 t
组数据;
接下来 t
行每行两个整数 n,m
,如题意。
【输出】
t
行,每行一个数,为 (nm)mod10007
的答案。
【输入样例】
4 5 1 5 2 7 3 4 2
【输出样例】
5 10 35 6
【提示】
数据范围与提示:
对于全部数据,1≤t≤200,1≤m≤n≤2×108
。
这道题没有什么含金量但是题目本身很神♂奇
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=10007; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline ll power(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } inline ll C(ll n,ll m) { ll n0=1,m0=1; for(ll i=n-m+1;i<=n;i++) n0=n0*i%mod; for(ll i=1;i<=m;i++) m0=m0*i%mod; return n0*power(m0,mod-2)%mod; } inline ll Lucas(ll n,ll m) { if(m==0) return 1; return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod; } int main() { int t; t=read(); ll n,m; while(t--) { n=(ll)read(); m=(ll)read(); printf("%lld\n",Lucas(n,m)); } return 0; }