AT_abc034_c 题解
Lele_Programmer · · 题解
AT_abc034_c 题解
思路
下文将题目输入的
如果直接 DP,时间复杂度
不难发现,对于一个
所以问题可以转化成,给定
发现总长度是
为了方便,这里把
很显然这是一个排列组合
根据
所以只需要求出
时间复杂度:
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
const int mod=1e9+7;
int n,m;
int exgcd(int a,int b,int& x,int& y) {
if (!b) {
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int fact(int k) {
int ans=1;
_rep(i,2,k) ans=ans*i%mod;
return ans;
}
int inv(int k) {
int x,y;
exgcd(k,mod,x,y);
return (x%mod+mod)%mod;
}
signed main() {
scanf("%lld %lld",&n,&m); n--,m--;
printf("%lld\n",fact(n+m)*inv(fact(n)*fact(m)%mod)%mod);
return 0;
}