貌似可以用公式做 即(n+m)/n*m 秒出 比赛时一看数据非常小 就直接暴力去敲了 连找规律的老本行都忘记了(>﹏<)
公式的意思即为 第i个位置上出现0的概率 m/(n+m) 第i+1个位置上出现1的概率 n/(n+m) 乘起来即 (n+m)/n*m
暴力时不能开数组存串否则会T掉 记录上一个位置的数即可
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#define pb push_back
#define debug puts("=====================");
typedef long long ll;
using namespace std;
int n,m;
int fz,fm;
void dfs(int x,int y,int id,int color,int cnt)
{
if(x+y==0)
{
fz+=cnt;
fm++;
return;
}
if(y) dfs(x,y-1,id+1,0,cnt);
if(x){
if(color==0) cnt++;
dfs(x-1,y,id+1,1,cnt);
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
fz=fm=0;
dfs(n-1,m,1,1,0);
dfs(n,m-1,1,0,0);
int g=__gcd(fz,fm);
printf("%d/%d\n",fz/g,fm/g);
}
}