[概率期望DP]JZOJ 4212 我想大声告诉你

Description

因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一些人,小R 自然也参加了。
这个游戏有n 个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局。x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率出局。(注意遭到攻击出局的人是不能攻击剩下的人的)
在所有人都出局之后,遭受攻击次数等于特定值的人能够成为胜者。所以现在小R 想要知道对于每一个0 <= k < n,自己恰好在遭受k 次攻击之后出局的概率是多少。(这里的出局指的不是被攻击出局)
注意在这题中,所有数值的运算在模258280327 的意义下进行。

Input

第一行输入一个正整数T 表示数据组数。
对于每一组数据输入仅一行三个数n, x, y,表示在这组数据中有n 个人参赛,p = x/y。保证y 和258280327 互质。

Output

对于每组数据,输出一行n 个整数,表示对于k = 0到n - 1 的概率在模258280327 意义下的值。

Sample Input

23 40 1009 32 1049

Sample Output

172186885 92980918 16529941229582513 163885050 39458156 102374877 116777758 216371874 55544199 95860736 8136787

Data Constraint

对于60% 的数据,n <=100
对于100% 的数据,n <= 2* 10^3,1 <= T <= 5,0<= x < y <= 10^9

分析

我想大声挖倍内听!吔X啦梁非凡!

内!我要炒内啊!

↑这是我看到题目一瞬间脑补的

这题意有个等价的方法

就是第i次游戏选第i个人,第i个人未出局就出局,并且使后面i+1~n个人有p概率出局,已出局就不管

其实是一样的

那么可以写DP

设f[i][j]为选第i个人前,1~i-1有j个人被点出局了

那么状态转移显然:

1、f[i+1][j+1]+=f[i][j]*((y-x)/y)^(j+1)(i被点掉了)

2、f[i+1][j]+=f[i][j]*(x/y)^(j)(i刚好没了)

最后求和除个n就行

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
typedef long long ll;
const int P=258280327;
const int N=2e3+10;
int T,n;
ll x,y,ny[N],f[N][N];

ll Power(ll x,ll y) {ll ans=1;for (;y;y>>=1,(x*=x)%=P) if (y&1) (ans*=x)%=P;return ans;}

int main() {
    for (scanf("%d",&T);T;T--) {
        scanf("%d%lld%lld",&n,&x,&y);
        ll cy=Power(y,P-2);ny[0]=1;memset(f,0,sizeof f);f[1][0]=1;
        for (int i=1;i<=n;i++) ny[i]=ny[i-1]*(y-x)%P*cy%P;
        for (int i=1;i<n;i++)
            for (int j=0;j<i;j++)
                if (f[i][j])
                    (f[i+1][j+1]+=f[i][j]*ny[j+1]%P)%=P,(f[i+1][j]+=f[i][j]*(1-ny[j]+P)%P)%=P;
        for (int i=0;i<n;i++) {
            ll lans=0;
            for (int j=1;j<=n;j++) (lans+=f[j][i])%=P;
            printf("%lld ",lans*Power(n,P-2)%P);
        }
        printf("\n");
    }
}

原文地址:https://www.cnblogs.com/mastervan/p/10316836.html

时间: 2024-10-18 11:15:02

[概率期望DP]JZOJ 4212 我想大声告诉你的相关文章

[概率dp] Jzoj P4212 我想大声告诉你

Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一些人,小R 自然也参加了.这个游戏有n 个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局.x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率出局.(注意遭到攻击出局的人是不能攻击剩下的人的)在所有人都出局之后,遭受攻击次数等于特定值的人能够成为胜者.所以现在小R 想要知道对于每一个0 <= k < n,自己恰好在遭受k 次攻击之后出局的概率是多

【BZOJ-1419】Red is good 概率期望DP

1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Discuss] Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一行输入两个数R,B,其值在0到5000之间 Output 在最优策略下平均能得到多少钱

CF148D--Bag of mice+概率期望dp

第一道概率期望dp:) 其实和一般的dp也差不多,只要状态选好就行了. 定义dp[i][j]表示还剩i只白老鼠j只黑老鼠时候公主赢得概率. 则:1.公主选白老鼠,直接赢,概率:i/(i+j) 2.公主选黑老鼠 1)龙选黑老鼠,逃走黑老鼠:概率:j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2) 2)  龙选黑老鼠,逃走白老鼠:概率:j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2) 3) 龙选白老鼠,这样公主是必输的,不用考虑 然后dp[i][j]等于以上概率之和

Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\) 表示第 \(i\) 个格子期望经过多少次,所以 \(dp_{n+1}=1\). https://www.cnblogs.com/suncongbo/p/11996219.html 原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12063633.ht

我想大声告诉你

"我想大声告诉你,对你的爱深不见底,用力紧紧抓住我们的回忆~~",I'm sorry,你想多了,我不想说love,I want to talk about English. 或许我们都有过对英语的憧憬.一时冲动,发奋图强,说"我要学好英语"."我爱英语"."我高中初中英语学的¥%##@%¥",可是这些建立的想的基础上.看上去精神境界很高.宣言很高调的语句究竟起到了how long的作用呢?--今天突然看到XX,"哇塞

Codeforces 908 D.New Year and Arbitrary Arrangement (概率&amp;期望DP)

题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾添加字母b,当出现≥k个ab子串时立即停止添加字母,求最后期望的ab子串个数.(子串ab不要求连续) 例子:当k=1,aab含2个ab,bbabbab时不可能出现的,因为到了bbab就会停止添加字母. 题解: 期望DP DP果然是智商的分界线 orz @.@#,这题题意其实我也没看太懂,后来看了别人

LightOJ 1030 Discovering Gold (概率/期望DP)

题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 \times N\) grid. Each cell of the cave can contain any amount of gold. Initially you are in position \(1\). Now each turn you throw a perfect \(6\) s

hdu4405--Aeroplane chess+概率期望dp

首先推荐一篇很好的如何概率期望问题的入门文章:点击打开链接 昨天比赛的时候面对这道题的第一想法是依照数学期望的定义来做,即依次求出某个点扔i次骰子能到达n点的概率,然后由期望的定义就可以求出答案了.但显然这在程序上是不可能实现的. 今天看了那篇文章后才知道自己的想法是大错特错的;求解这种问题应该采用一种递推的思路,即每次只考虑一次转移后当前状态的期望,然后我们依次考虑每个节点就可以得到一个方程组,然后就只需要求解这个方程组就行了. 当然对于如何求解这个方程组,我们可以采用高斯消元法,当然如果这个

【POJ 2096】Collecting Bugs 概率期望dp

题意 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n. 求他找到s个系统的bug,n种bug,需要的天数的期望. 分析 计算期望E=∑所有可能需要的天数*概率 找到s个系统n种bug,需要最少max(s,n)天,而可能的天数是无穷的,这样计算很复杂,复杂到算不了. 所以考虑dp,期望E=∑(昨天可以转移到现在状态的所有可能的情况的期望+1)*概率=∑(昨天可以转移到现在状态的所有可能的情况的