bzoj1867钉子和小球
简单$DP$
$$dp[1][1]=1(\text{显然})$$
$$map[i][j]=='*'?dp[i+1][j]+=dp[i][j]/2,dp[i+1][j+1]+=dp[i][j]/2:dp[i+2][j+1]+=dp[i][j]$$
如果直接输出概率这样就好,
但是让写成分数咋整?
开个结构体记录分子分母可以(好像大部分人这么做的)
本宝宝一开始开了两个数组分别记录,
但是人 萌 可爱 会出现各种 正义 玄学的事情,
反正开结构体的计算过程中没有爆$long\ long$
本宝宝就爆了。
写了两遍都被自己拍地上了
最后只好换种方法,
我们先假设分子分母同时乘以$2^{n}$
然后计算的时候分子除就好,最后同时约分
然后就$RE$了$qwq$
为啥?!
某几位良心同学:“此题并不能输出文件末回车,会$RE$”
莫名想吐槽$bzoj=reoj$
上代码:
/************************************************************** Problem: 1867 User: zhangheran Language: C++ Result: Accepted Time:12 ms Memory:1316 kb ****************************************************************/ #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; long long f[57][57]; char map[57][57]; int n,m; template<typename _Element_gcd> _Element_gcd _gcd(_Element_gcd _m, _Element_gcd _n) { while (_n != 0) { _Element_gcd _t = _m % _n; _m = _n; _n = _t; } return _m; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) while(map[i][j]!='*'&&map[i][j]!='.') scanf("%c",&map[i][j]); f[1][1]=1ll<<n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(map[i][j]=='*') f[i+1][j]+=f[i][j]/2, f[i+1][j+1]+=f[i][j]/2; else f[i+2][j+1]+=f[i][j]; long long dp=1ll<<n; long long num=_gcd(f[n+1][m+1],dp); f[n+1][m+1]==0?printf("0/1"):printf("%lld%c%lld",f[n+1][m+1]/num,47,dp/num); return 0; }