YY一下发现答案基本上就是(n+1)+ΣC(n+i,i),其中i=1...m。
然后发现后面每一项可以递推,只要处理1..m的逆元就好了。
这题很容易爆long long,每一步都要取模。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000050 #define mod 1000000007 using namespace std; long long n,m,inv[maxn],prime[maxn],tot=0,ret=1,ans=1; bool vis[maxn]; void get_table() { inv[1]=1; for (long long i=2;i<=maxn-50;i++) { inv[i]=((-mod/i)*inv[mod%i]%mod+mod)%mod; if (!vis[i]) {vis[i]=true;prime[++tot]=i;} for (long long j=1;j<=tot && i*prime[j]<=maxn-50;j++) { vis[i*prime[j]]=true; if (!i%prime[j]) break; } } } int main() { scanf("%lld%lld",&n,&m); if (n<m) swap(n,m); get_table();ans=(2*n+2)%mod;ret=(n+1)%mod; for (long long i=2;i<=m;i++) { ret=ret*((n+i)%mod)%mod*inv[i]%mod; ans=(ans+ret)%mod; } printf("%lld\n",ans); return 0; }