CF698C. LRU

题意:n种物品,大小为k的队列,\(p_i\)的概率选择第i种物品放入队尾,如果已经有i了就不放了。队列大小>k时弹出队首。求\(10^{100}\)次操作后每种物品在队列里的概率


为什么没有官方题解啊,所以看了讨论区的题解

一开始想的是,一个元素在队列里,说明后来加入的元素种类<k,对于每种物品i,求出每个\(|S| =0…k-1 : i \notin S\)的集合出现在i右面的概率就行了。但这时候要求的是\(S\)中每种物品至少出现1次,至多无限次,只是简单的乘上\(\prod\limits_{i \in S}p_i\) 再乘上 \(\frac{1}{1-x}\)是不对的。

所以考虑容斥原理,求出\(S\)的任意子集出现的概率。

求这个概率很简单,每种元素可以不出现,设\(x=\sum\limits_{i \in S}p_i\),那么

\(P=x+x^2+...+x^{\infty}=\frac{1}{1-x}\)

根据容斥原理,\(i\)的答案就是

\[\le k-1种元素的集合出现的概率\ -\ \le k-2种元素的集合出现的概率*容斥系数\ +\ ...
\]

和之前的恰好k个问题一样,这个容斥系数需要乘上超集的个数,比如大小为\(i\)的集合,他的大小为\(j\)的超集的个数是\(\binom{n-1-i}{j-i}\),注意是\(n-1\)因为当前计算答案的元素不能选

需要注意的是,我们要同时求恰好\(0...k-1\)个,所以每个的容斥系数都要+1,并且要处理之前所有大小的超集

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=21, M=(1<<20)+5;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
} int n, k, c[N][N];
double p[N], sum[M], coe[N], g[M];
inline int one(int x) { int c=0; while(x) x&=x-1, c++; return c; } int main() {
freopen("in","r",stdin);
n=read(); k=read();
for(int i=0; i<n; i++) scanf("%lf",&p[i]), sum[1<<i] = p[i];
c[0][0]=1;
for(int i=1; i<=n; i++) {
c[i][0]=1;
for(int j=1; j<=i; j++) c[i][j] = c[i-1][j] + c[i-1][j-1];
} int all=1<<n;
for(int i=0; i<all; i++) if(!sum[i]) sum[i] = sum[i&-i] + sum[i^(i&-i)];
for(int i=k-1; i>=0; i--) {
coe[i] = 1;
for(int j=i+1; j<=k-1; j++) coe[i] -= coe[j] * c[n-1-i][j-i];
//printf("coe %d %lf\n",i,coe[i]);
} for(int i=0; i<n; i++) {
if(p[i]==0 || p[i]==1 || k==1) {printf("%.9lf ", p[i]); continue;}
double ans=0;
for(int s=0; s<all; s++)
if(!((1<<i) & s) && one(s)<=k-1) ans += coe[one(s)]/(1-sum[s]);// printf("s %d %lf\n",s, ans);
printf("%.9lf ", p[i]*ans);
}
}

CF698C. LRU [容斥原理 概率]的更多相关文章

  1. CF698C - LRU

    这又是什么毒瘤..... 解:把操作序列倒着来,就是考虑前k个入队的元素了.显然这样每个元素的概率不变. 状压.设fs表示当前元素为s的概率. 每次转移的时候选择一个不在s中的元素,作为下一个加入的元 ...

  2. hdu4336 Card Collector 概率dp(或容斥原理?)

    题意: 买东西集齐全套卡片赢大奖.每个包装袋里面有一张卡片或者没有. 已知每种卡片出现的概率 p[i],以及所有的卡片种类的数量 n(1<=n<=20). 问集齐卡片需要买东西的数量的期望 ...

  3. Codeforces Round #363 LRU(概率 状压DP)

    状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...

  4. 51Nod 1667 概率好题 - 容斥原理

    题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...

  5. BZOJ4036 HAOI2015按位或(概率期望+容斥原理)

    考虑min-max容斥,改为求位集合内第一次有位变成1的期望时间.求出一次操作选择了S中的任意1的概率P[S],期望时间即为1/P[S]. 考虑怎么求P[S].P[S]=∑p[s] (s&S& ...

  6. LOJ2541 PKUWC2018猎人杀(概率期望+容斥原理+生成函数+分治NTT)

    考虑容斥,枚举一个子集S在1号猎人之后死.显然这个概率是w1/(Σwi+w1) (i∈S).于是我们统计出各种子集和的系数即可,造出一堆形如(-xwi+1)的生成函数,分治NTT卷起来就可以了. #i ...

  7. 2018.08.31 bzoj3566: [SHOI2014]概率充电器(概率dp+容斥原理)

    传送门 概率dp好题啊. 用f[i]" role="presentation" style="position: relative;">f[i] ...

  8. [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】

    Description Solution 首先它的限制关系是一个树形图 首先考虑如果它是一个外向树该怎么做. 这是很简单的,我们相当于每个子树的根都是子树中最早出现的点,概率是容易计算的. 设DP状态 ...

  9. [LOJ3124][CTS2019|CTSC2019]氪金手游:树形DP+概率DP+容斥原理

    分析 首先容易得出这样一个事实,在若干物品中最先被选出的是编号为\(i\)的物品的概率为\(\frac{W_i}{\sum_{j=1}^{cnt}W_j}\). 假设树是一棵外向树,即父亲比儿子先选( ...

随机推荐

  1. 电铸3D18K硬金 电铸易熔合金 电铸中空硬金饰品合金

        俊霖电铸3DK金易熔合金是要求相互关连,互为条件,缺一不可,是产品完整性和完美性的重要体现.    第一.适用性:电铸3DK金易熔合金的性能应适用于电铸.首饰.K金饰品.摆件等工艺品的易熔合金 ...

  2. PHP error_reporting() 错误控制函数功能详解

    定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别.   函数语法: error_reporting(report_level)   如果参数 level 未指定 ...

  3. file_get_contents("php://input")的使用方法

    $data = file_get_contents("php://input"); //input 是个可以访问请求的原始数据的只读流. POST 请求的情况下,最好使用 php: ...

  4. C#编写影院售票系统(A project with a higher amount of gold )

    项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...

  5. 最简Java程序

    本文是笔者创建项目--一系列java示例程序的总结.项目位置在SimplestJavaDemos,欢迎访问. 以下为正文: ---   作为一个伪完美主义+拖延癌患者,每次要学习新技术的时候,总是要把 ...

  6. hasResultError

    hasResultError 的作用是 让返回的对象可以报错误信息.

  7. mysql 两个时间段的差,可以是秒,天,星期,月份,年...

    SELECT TIMESTAMPDIFF(SECOND, now(), "2012-11-11 00:00:00") 语法为:TIMESTAMPDIFF(unit,datetime ...

  8. [JS]Math.random()

    参考网址:http://www.soulteary.com/2014/07/05/js-math-random-trick.html [JS]Math.random()的二三事 看到题目,如果大家平时 ...

  9. linux ubuntu 远程ssh登录

    当我们有一个Linux系统的时候,可能用到远程ssh登录,当你是没有界面的系统的时候也会用到,远程操作起来比较方便. 首先我们的电脑默认是不安装ssh的,就是无法通过ssh远程连接,所以要安装shh. ...

  10. CentOS7中使用iptables

    原文地址:http://blog.csdn.net/u012486840/article/details/53161555 1.关闭firewall: systemctl stop firewalld ...