Chess
题目链接:Chess
思路:设长边为n,短边为m,则题意为最多摆放m个車有多少种方案。
即从1~n中选m个数,也就是C(n,m)
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e3+10;
const int mod=1e9+7;
LL qmod(LL a,LL n,LL p)
{
int ans=1;
while(n)
{
if(n&1)
ans=ans*a%p;
a=a*a%p;
n>>=1;
}
return ans;
}
LL Comb(LL n,LL m,LL p)
{
if(n<m)
return 0;
if(n==m)
return 1;
m=min(n-m,m);
LL ans=1,cn=1,cm=1;
for(LL i=0;i<m;++i)
{
cn=cn*(n-i)%p;
cm=cm*(m-i)%p;
}
ans=cn*qmod(cm,p-2,p)%p;
return ans;
}
LL Lucas(LL n,LL m,LL p)
{
LL ans=1;
while(n&&m&&ans)
{
ans=ans*Comb(n%p,m%p,p)%p;
n/=p;
m/=p;
}
return ans;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n<m)
swap(n,m);
printf("%d\n",Lucas(n,m,mod));
}
return 0;
}