ZZULIOJ 2135 这里是天堂!【概率Dp---拆分分子分母】
来源:互联网 发布:php黑客帝国数字雨代码 编辑:程序博客网 时间:2024/05/01 03:09
2135: 这里是天堂!
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 921 Solved: 114
SubmitStatusWeb Board
Description
Maple他打代码打累了,于是Maple跑去找猫猫们来拯救自己。
Maple来到了一个空房间里,房间的隔壁是一个有很多只猫猫的房间,在Maple的房间里有一个按钮,每次按一下按钮,就会有且只有一只猫猫从旁边的房间里跑过来找Maple玩,当然当隔壁房间没有猫的时候并不会有猫猫跑过来。
Maple按了几次按钮后发现跑过来的猫猫只有白色和黄色两种毛色,而且如果假设当每次按按钮后旁边房间剩下的猫跑过来的概率都相同,那么Maple就开始想,如果当隔壁房间共有n只白猫和m只黄猫时,当他按了k次按钮后,跑过来的白猫数量和黄猫数量分别为a只和b只的概率是多少。
Input
第一行有一个整数T,代表有T组数据(1<=T<=2000)
每组数据有五个整数n,m,k,a,b,其中0<=n,m,k,a,b<=10
Output
对于每组数据,得到的概率为一个分数A/B(A<=B且AB为互质整数),输出两个整数A、B,用一个空格分开。
Sample Input
Sample Output
HINT
特殊的,概率为0的分数表示法为0/1。
思路:
如果结果要求输出的是浮点数,那么我们不妨直接设定dp【i】【j】【k】表示按了第i下,已经出来了j只白猫以及k只黄猫的概率。
那么就有:
dp【i】【j】【k】+=dp【i-1】【j-1】【k】*[ (n-j-1) /(n+m-(j-1)-k)];
dp【i】【j】【k】+=dp【i-1】【j】【k-1】*[(m-(k-1))/(n+m-(k-1)-j)];
但是现在要求的是输出分子/分母的形式。
那么我们拓展设定:dp【i】【j】【k】【2】,其中dp【i】【j】【k】【0】存入的是分子,dp【i】【j】【k】【2】存入的是分母即可。
那么过程模拟分数加和并且维护一下分子和分母即可。
注意n==a &&m==b&&k>=n+m的时候也要输出1 1.
另外要注意数据范围。
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;#define ll long long intll dp[15][15][15][2];ll gcd(ll x,ll y){ return y==0?x:gcd(y,x%y);}int main(){ ll t; scanf("%lld",&t); while(t--) { ll n,m,k,a,b; scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&a,&b); if(n==a&&m==b&&k>=a+b) { printf("1 1\n"); continue; } memset(dp,0,sizeof(dp)); dp[0][0][0][0]=1; dp[0][0][0][1]=1; for(ll i=1;i<=k;i++) { for(ll j=0;j<=n;j++) { for(ll k=0;k<=m;k++) { if(j+k==i) { if(j-1>=0) { ll x=dp[i-1][j-1][k][0]*(n-(j-1)); ll y=dp[i-1][j-1][k][1]*(n+m-(j-1)-k); ll xx=dp[i][j][k][0]; ll yy=dp[i][j][k][1]; if(xx==0||yy==0) { ll fenmu=y; ll fenzi=x; ll g=gcd(fenmu,fenzi); fenzi=fenzi/g; fenmu=fenmu/g; dp[i][j][k][0]=fenzi; dp[i][j][k][1]=fenmu; } else { ll fenmu=y*yy; ll fenzi=x*yy+xx*y; ll g=gcd(fenmu,fenzi); fenzi=fenzi/g; fenmu=fenmu/g; dp[i][j][k][0]=fenzi; dp[i][j][k][1]=fenmu; } } if(k-1>=0) { ll x=dp[i-1][j][k-1][0]*(m-(k-1)); ll y=dp[i-1][j][k-1][1]*(n+m-(k-1)-j); ll xx=dp[i][j][k][0]; ll yy=dp[i][j][k][1]; if(xx==0||yy==0) { ll fenmu=y; ll fenzi=x; ll g=gcd(fenmu,fenzi); fenzi=fenzi/g; fenmu=fenmu/g; dp[i][j][k][0]=fenzi; dp[i][j][k][1]=fenmu; } else { ll fenmu=y*yy; ll fenzi=x*yy+xx*y; ll g=gcd(fenmu,fenzi); fenzi=fenzi/g; fenmu=fenmu/g; dp[i][j][k][0]=fenzi; dp[i][j][k][1]=fenmu; } } } } } } if(dp[k][a][b][0]==0&&dp[k][a][b][1]==0)printf("0 1\n"); else printf("%lld %lld\n",dp[k][a][b][0],dp[k][a][b][1]); }}
- ZZULIOJ 2135 这里是天堂!【概率Dp---拆分分子分母】
- ZZULIOJ 2135: 这里是天堂!
- 分数 分子分母
- 分子,分母的化简以及加减乘除
- 前两分数分母之和与分子之和分别等于后面的分母与分子之和。
- 穷举法解方程:一个最简分数,若分子加上3,约分后为 1/3 ,若分母减去2,约分后为 1/4 ,这个分数是?
- 怎样在Excel中输入带有分子分母的分数
- 射耙问题 字母塔 分母和分子
- 谈ArcGIS分数标注的问题 分子分母形式
- 实现一个用分子分母的格式来表示有理数的结构体rational以及相关的函数,rational结构体之间可以做加减乘除运算,运算的结果仍然是rational
- zzulioj 1894 dp
- 是天堂,也是地狱
- “消极”是一个乱党分子
- pku--3979 分数加减法(注意分子为0,分母为1的情况)
- 当在SQL中遇到分子/分母为0时的方法
- CF 209 Div2 (C) 快速幂 求分子(一堆数相加)和分母的最大公约数
- 按递增顺序列出所有分母为40,分子小于40的最简分数
- Excel查询序列所对应的值-vLoopup函数,求比例分子改变但分母不变
- Java事件处理——按钮和按键映射到动作对象
- CRC32查表法算法实现
- 数组拷贝
- cgi配置:apache2.4与apache2.2区别
- Python: PS 图像调整--对比度调整
- ZZULIOJ 2135 这里是天堂!【概率Dp---拆分分子分母】
- WSAAsyncGetHostByName()函数的正确使用!
- 使用 Office 365 PowerShell 管理用户帐户和许可证(八)使用 Office 365 PowerShell 冻结用户账户
- Spring MVC之异常处理
- Java基础--递归算法(递归结构)
- 对Maven、gradle、svn、spring 3.0 fragment、git的想法
- 微信小程序: WebSocket应用
- 使用 Office 365 PowerShell 管理用户帐户和许可证(九)使用 Office 365 PowerShell 删除和还原用户账户
- 重定向top输出到文件后,用Vi打开乱码,用cat输出格式正常