HDU-6114
Posted 被咬过的馒头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-6114相关的知识,希望对你有一定的参考价值。
虽然这是一道水题,不过这道c(n,m)%mod 的模板值得记录
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=1e9+7; const int N = 2000 + 5; int F[N], Finv[N], inv[N]; void init() { inv[1] = 1; for(int i = 2; i < N; i ++) { inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD; } F[0] = Finv[0] = 1; for(int i = 1; i < N; i ++) { F[i] = F[i-1] * 1ll * i % MOD; Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD; } } int comb(int n, int m) //comb(n, m)就是C(n, m) { if(m < 0 || m > n) return 0; return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD; } int main() { int t; init(); scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); printf("%d\n",comb(max(n,m),min(n,m))); } }
也可以用dp做,记录一个递推公式 c(n,m)=(c(n-1,m-1)+c(n-1,m))%mod;
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int mod=1000000007; int T,n,m,ans; LL c[1005][1005]; LL C(int x,int y) { if(y==x||y==0)return 1; if(y==1)return x; if(c[x][y])return c[x][y]%mod; c[x][y]=(C(x-1,y-1)+C(x-1,y))%mod; return c[x][y]; } int main() { scanf("%d",&T); while(T--){ scanf("%d %d",&n,&m); printf("%I64d\n",C(max(n,m),min(n,m))); } return 0; }
以上是关于HDU-6114的主要内容,如果未能解决你的问题,请参考以下文章