首先初始化dp[][],把dp[1][1]初始化为2^n,目的是为了是最后一个的的次数大于1;
然后用一个gcd()求一下最大公约数,然后没有然后了。
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#define ll long long
using namespace std;
ll n,m;
ll dp[55][55];
int gcd(ll a,ll b)
{
return b == 0? a:gcd(b,a%b);
}
int main()
{
while(cin>>n>>m){
memset(dp,0,sizeof(dp));
dp[1][1] = ((ll)1)<<n;
for(int i = 1; i <=n; i++)
{
for(int j = 1; j <= i; j++)
{
char ch;
cin>>ch;
if(ch == '*')
{
dp[i+1][j] +=dp[i][j]/2;
dp[i+1][j+1] += dp[i][j]/2;
}
else
dp[i+2][j+1] += dp[i][j];
}
}
ll g=gcd(dp[n+1][m+1],dp[1][1]);
printf("%lld/%lld\n",dp[n+1][m+1]/g,dp[1][1]/g );
}
return 0;
}
poj 1189 钉子和小球
最新推荐文章于 2018-05-17 12:39:09 发布