#include<iostream>usingnamespace std;constint N =1e5+5, mod =1e9+7;typedeflonglong LL;
LL fact[N], infact[N];int n;intqmi(int a,int k,int p){int res =1;while(k){if(k &1)res =(LL)res * a % mod;
k >>=1;
a =(LL)a * a % mod;}return res;}intmain(){
fact[0]= infact[0]=1;for(int i =1; i < N; i++){
fact[i]= fact[i -1]* i % mod;
infact[i]= infact[i -1]*qmi(i, mod -2, mod)% mod;}
cin >> n;while(n--){int a, b;
cin >> a >> b;
cout << fact[a]% mod * infact[b]% mod * infact[a - b]% mod << endl;}return0;}
#include<iostream>usingnamespace std;typedeflonglong LL;int p;intqmi(int a,int k){
LL res =1;while(k){if(k &1)res = res * a % p;
k >>=1;
a =(LL)a * a % p;}return res;}//计算a,b均小于p时的组合数,利用阶乘+逆元+预处理(对应求组合数II)
LL C(int a,int b){int res =1;for(int i =1, j = a; i <= b; i++, j--){
res =(LL)res * j % p;
res =(LL)res *qmi(i, p -2)% p;}return res;}
LL lucas(LL a, LL b){if(a < p && b < p)returnC(a, b)% p;returnC(a % p, b % p)*lucas(a / p, b / p)% p;//卢卡斯定理}intmain(){int n;
cin >> n;while(n--){
LL a, b;
cin >> a >> b >> p;
cout <<lucas(a, b)<< endl;}return0;}
#include<iostream>#include<algorithm>#include<cstring>#include<vector>usingnamespace std;constint N =5005;int primes[N], cnt, sum[N];bool st[N];int a, b;voidbroke(int n){for(int i =2; i <= n; i++){if(!st[i])primes[cnt++]= i;for(int j =0; i * primes[j]<= n; j++){
st[i * primes[j]]=true;if(i % primes[j]==0)break;}}}intget(int a,int p)//统计a中质因数p的指数并返回该指数{int res =0;while(a){
res += a / p;
a /= p;}return res;}
vector<int>mul(vector<int>a,int b){
vector<int>c;int t =0;for(int i =0; i < a.size(); i++){
t += a[i]* b;
c.push_back(t %10);
t /=10;}while(t){
c.push_back(t %10);
t /=10;}return c;}intmain(){
cin >> a >> b;broke(a);//筛出2~a中的所有质数,这些质数包含了a!,b!和(a-b)!的所有质因数for(int i =0; i < cnt; i++){int p = primes[i];
sum[i]=get(a, p)-get(b, p)-get(a - b, p);//计算c[a][b]中质因数p的指数}
vector<int>res;
res.push_back(1);//依次遍历筛选出的2~a的所有质数,利用高精度乘法循环将该质数乘入res中,循环次数为sum[i]for(int i =0; i < cnt; i++)for(int j =0; j < sum[i]; j++)
res =mul(res, primes[i]);for(int i = res.size()-1; i >=0; i--)
cout << res[i];return0;}
#include<iostream>usingnamespace std;constint mod =1e9+7;typedeflonglong LL;intqmi(int a,int k){int res =1;while(k){if(k &1)res =(LL)res * a % mod;
k >>=1;
a =(LL)a * a % mod;}return res;}intmain(){int n;int res =1;
cin >> n;for(int i =1, j =2* n; i <= n; i++, j--){
res =(LL)res * j % mod;
res =(LL)res *qmi(i, mod -2)% mod;}
res =(LL)res *qmi(n +1, mod -2)% mod;
cout << res << endl;return0;}
数学知识——组合数组合数I(n<=10000, a,b<=2000 mod p)组合数II(n<=1000,a,b<=105 mod p)组合数III(n<=20, a,b<=1018, mod p)组合数IV(a,b<=5000)满足条件的01序列AcWing 885. 求组合数 I核心思路:预处理、动态规划o(n2)从a个数中选b个数的所有方案可以分为两类(从a个物品中任选一个设为x):选出的b个物品包含x:c[a-1][b-