首页 > 代码库 > HDU-6114
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。