题:https://www.nowcoder.com/acm/contest/139/A
思路:考虑01 和12 的分界线
是(n, 0) 到(0, m) 的两条不相交(可重合)路径
平移其中一条变成(n-1, -1) 到(-1, m-1)
变成起点(n, 0) 和(n-1, -1),终点(0, m) 和(-1, m-1) 的严格不相交路径
套Lindström–Gessel–Viennot lemma
答案是Cn+m, n
2 - Cn+m, m - 1 Cn+m, n-1
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000;
const long long p=1e9+7;
long long f[maxn+10];
void init(){//阶乘
f[0]=1;
for(long long i=1;i<=maxn;i++){
f[i]=(long long)f[i-1]*i%p;
}
}
long long fast(long long a,long long n){
if(n==0)return 1;
if(n%2)return a*fast(a,n-1)%p;
long long tmp=fast(a,n/2);
return tmp*tmp%p;
}
long long C(long long n,long long m){
if(n==m||m==0)return 1ll;
return ((long long)f[n]*fast(f[m],p-2)%p)*fast(f[n-m],p-2)%p;
}
int main(){
init();
long long n,m;
while(~scanf("%lld%lld",&n,&m)){
// printf("%lld\n",C(n+m,n));
// printf("%lld\n",C(n+m,n-1));
// printf("%lld\n",C(n+m,m-1));
printf("%lld\n",((C(n+m,n)*C(n+m,n)-(C(n+m,n-1)*C(n+m,m-1))%p+p)%p)%p);
}
return 0;
}