ZJYYC2510. 蓝红球
ZJYYC2510. 蓝红球
题目
题目解析及思路
题目要求将蓝色球分成 i 个堆,第i行输出可能的排列方式
即组合数问题,推理可知答案为Ci-1m-1 * Cin-m+1
组合数问题都是乘法逆元的题,公式为Cba = fac[a] * infac[b] * infac[a-b]
代码
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 2010;
typedef long long LL;
LL fac[N],infac[N];
//快速幂,用来求乘法逆元
LL qmi(LL a,LL b){
LL res = 1;
while(b){
if(b & 1) res = (res * a) % MOD;
b >>= 1;
a = (a * a) % MOD;
}
return res;
}
//求逆元和阶乘
void solve(){
fac[0] = infac[0] = 1;
for(int i=1;i<N;i++){
fac[i] = fac[i-1] * i % MOD;
}
for(int i=1;i<N;i++){
//根据费马小定理(有模数MOD的前提下)推出:i的逆元 = i-1的逆元 * i的模数-2次方
infac[i] = infac[i-1] * qmi(i,MOD-2) % MOD;
}
}
//组合数函数
LL C(int a,int b){
if(a<0 || b<0 || a<b) return 0;
return fac[a] * infac[b]%MOD * infac[a-b]%MOD;
}
int main(){
solve();
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
LL c1 = C(m-1,i-1) % MOD;
LL c2 = C(n-m+1,i) % MOD;
cout<<(c1*c2)%MOD<<endl;
}
}