ZZULIOJ 2135 这里是天堂!【概率Dp---拆分分子分母】

来源:互联网 发布:php黑客帝国数字雨代码 编辑:程序博客网 时间:2024/05/01 03:09

2135: 这里是天堂!

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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

2
1 1 1 1 0
9 1 10 9 1

Sample Output

1 2
1 1

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]);    }}






阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃过敏药嗜睡乏力怎么办 写字紧张心跳的快手抖怎么办 怀孕食欲差没精神怎么办 爬个三楼就喘了怎么办 头被篮球砸了怎么办 打球手指肿了很久怎么办 客人吃饭跑单了怎么办 脑子总是记不住东西怎么办 穿的鞋有味道怎么办 生完孩子血糖高怎么办 生了孩子子宫大怎么办 生完孩子阴吹怎么办 怀孕初期感冒嗓子发炎怎么办 脑子转不过来弯怎么办 他说我道行不深怎么办 鞋子内测磨破了怎么办 老公拉肚子拉的很厉害怎么办 老公拉肚子拉得很厉害怎么办 和老公吵架很厉害怎么办 新鞋鞋底吱吱响怎么办 新鞋鞋底滑了怎么办 工作中同事不配合怎么办 做体力活一身疼怎么办 大脑左则中动脉血管狭窄?怎么办 儿童体质差免疫力差怎么办 nba篮球大师体力不够怎么办 一千米差10秒怎么办 四十岁以后体力和耐力差怎么办 打篮球一打比赛就紧张怎么办 耐克空军鞋鞋底边胶掉了怎么办 鞋底踩到老鼠胶怎么办 头蒙怎么办最快最有效 备孕老公压力大怎么办 宝宝太兴奋不睡怎么办 我很烦只睡三小时觉怎么办才好 柯基精力太旺盛怎么办 孩子学习熬夜精力不足怎么办 肺癌晚期吃不下饭怎么办 这俩天吃药太多肝肾功能不好怎么办 跑步跑得头疼晕怎么办 吃完辣的想吐怎么办