HDU 6114 Chess
思路:求C(n,m),除法取余用乘法逆元算。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),sizeof(a)) const int MOD=1e9+7; ll e_gcd(ll a,ll b,ll &x,ll &y) { if(!b) { x=1; y=0; return a; } ll ans=e_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return ans; } ll inv(ll a,ll n) { ll x,y,d=e_gcd(a,n,x,y); if(d==1)return (x%n+n)%n; else return -1; } ll C(ll n,ll m) { ll ans=1; for(ll i=n;i>=n-m+1;i--)ans=(ans*i)%MOD; for(ll i=1;i<=m;i++)ans=((ans%MOD)*(inv(i,MOD)%MOD))%MOD; return ans; } int main() { int n,m; int t; cin>>t; while(t--) { cin>>n>>m; if(n<m)swap(n,m); int ans=C(n,m); cout<<ans<<endl; } return 0; }