网站建设流程哪家好长沙百度推广开户
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;}
}