GYM 100883 G.Count Mix Strings(组合数学)

来源:互联网 发布:beta理财师软件 编辑:程序博客网 时间:2024/06/10 09:49

Description
给出两个长度分别为n和m的字符串a和b,要求在不改变两个串内部的先后顺序的条件下把两个串并在一起,问情况数(算重)
Input
第一行一整数T表示用例组数,每组用例输入两个整数n和m表示两个串的长度(1<=T,n,m<=10000)
Output
输出方案数
Sample Input
3
1 1
1 2
2 2
Sample Output
2
3
6
Solution
显然答案为C(n+m,n)
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 22222const ll mod=1000000007ll;ll f[maxn],inv[maxn];ll mod_pow(ll a,ll b,ll mod){    ll ans=1ll;    while(b)    {        if(b&1)ans=ans*a%mod;        a=a*a%mod;        b>>=1;    }    return ans;}void init(){    f[0]=inv[0]=1;    for(int i=1;i<=20000;i++)f[i]=1ll*i*f[i-1]%mod,inv[i]=mod_pow(f[i],mod-2,mod);}ll deal(int n,int m){    return f[n+m]*inv[n]%mod*inv[m]%mod;}int main(){    init();    int T,n,m;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        ll ans=deal(n,m);        printf("%I64d\n",ans);      }    return 0;}
0 0
原创粉丝点击