NC206073. 山脉
描述
输入描述
共 t+1行 .第1行,仅1个数 , t.第2行至第t+1行,每行2个数: n,m .
输出描述
共 t 行 .第1行至第 t 行,每行1个数表示方案数对1e9 + 7取模后的结果
示例1
输入:
2 2 3 3 3
输出:
7 22
说明:
示例2
输入:
4 26 26 262 626 62626 26262 2626262 2626266
输出:
318836234 471802003 756001620 760321595
C++11(clang++ 3.9) 解法, 执行用时: 337ms, 内存消耗: 117808K, 提交时间: 2020-09-05 19:10:42
#include<bits/stdc++.h> #define LL long long using namespace std; const int N=1.5e7+5,P=1e9+7; int fac[N],ifac[N]; LL qpow(LL x,LL y){LL res=1;for(;y;y>>=1,x=(LL)x*x%P)if(y&1)res=(LL)res*x%P;return res;} int C(int x,int y){return (LL)fac[x]*ifac[y]%P*ifac[x-y]%P;} int main(){ int T;scanf("%d",&T);fac[0]=1; for(int i=1;i<N;i++)fac[i]=fac[i-1]*(LL)i%P; ifac[N-1]=qpow(fac[N-1],P-2); for(int i=N-2;~i;i--)ifac[i]=ifac[i+1]*(LL)(i+1)%P; while(T--){ int n,m,ans=0;scanf("%d%d",&n,&m);m--; for(int i=1,j=m;i<=n;i++,j+=2)ans=(ans+C(j,m))%P; printf("%d\n",ans); } return 0; }
C++14(g++5.4) 解法, 执行用时: 777ms, 内存消耗: 235256K, 提交时间: 2020-09-05 22:48:31
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7,N=15000005; typedef long long ll; int n,m; ll f[N],invf[N]; ll C(int n,int m) { return f[n]*invf[n-m]%mod*invf[m]%mod; } int main() { f[0]=f[1]=invf[0]=invf[1]=1; for(int i=2;i<N;i++) f[i]=f[i-1]*i%mod,invf[i]=(mod-mod/i)*invf[mod%i]%mod; for(int i=2;i<N;i++) invf[i]=invf[i]*invf[i-1]%mod; int t;scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); ll ans=1; for(int i=1;i<n;i++) ans=(ans+C(m+2*i-1,m-1))%mod; printf("%lld\n",ans); } }