正题
题目链接:https://www.luogu.org/problemnew/show/P5135
题目大意
n∗mn*mn∗m的矩阵每列恰好有一个黑格子,询问两个中一个
- 每列黑格子所在行数不下降
- 每列黑格子所在行数单调上升
的方案数
解题思路
显然询问1答案就是Cn+m−1mC_{n+m-1}^mCn+m−1m(插板法)
对于询问2答案就是CnmC_n^mCnm
然后逆元计算即可,但是注意要线性求逆元。
时间复杂度O(Tm)O(Tm)O(Tm)
codecodecode
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6,XJQ=1e9+7;
ll T,inv[N+100];
ll C(ll n,ll m)
{if(n<m) return 0;ll ans=1;for(ll i=1;i<=m;i++)ans=ans*((n-i+1)%XJQ)%XJQ*inv[i]%XJQ;return ans;
}
int main()
{inv[1]=1;for(ll i=2;i<=N;i++)inv[i]=inv[XJQ%i]*(XJQ-XJQ/i)%XJQ;scanf("%lld",&T);while(T--){ll n,m,op;scanf("%lld%lld%lld",&n,&m,&op);if(op==0) printf("%lld\n",C(n+m-1,m));else printf("%lld\n",C(n,m));}
}