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. 北京师范大学校赛C

    https://www.nowcoder.com/acm/contest/submit/0dff89ad7b8444719df155d507f3e1dd?ACMContestId=3&tagI ...

  2. 命运(经典dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 命运 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  3. angular-dragon-drop.js 双向数据绑定拖拽的功能

    在做公司后台物流的时候,涉及到34个省市分为两个部分,一部分为配送区域,另一部分为非配送区域,想利用拖拽的功能来实现,最好两部分的数组能自动更新. 刚好找到angular-dragon-drop.js ...

  4. UEP-时间的比较

    时间的比较: var rec = ajaxform.getRecord(); var sd = rec.get("startDate"); var ed = rec.get(&qu ...

  5. 关于atom

    以前老听别人说atom这款编辑器如何如何的好用,今天特地试了下,结果一不小心将顶部的工具栏给隐藏了,弄了半天都没弄出来.后来就在网上到处寻找帮助,试试这个试试那个,终于弄好了,其实是这样的. 首先在任 ...

  6. JavaScript语法基础:数组的常用方法详解

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 数组的定义 之前学习的数据类型,只能存储一个值(字符串为一个值).如果我 ...

  7. 给织梦DEDECMS添加栏目图片与英文名显示

    开始做微网站了,不同于传统手机网站,因为微信上的微网站是支持CSS3与HTML5的,好吧,各种要学习的还有很多很多阿~这么多新代码,叹! 本来想转战帝国CMS了,奈何这名字太不对味了,PHPCMS也懒 ...

  8. MyBatis的关于批量数据操作的测试

    摘录自:http://www.linuxidc.com/Linux/2012-05/60863.htm MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis.My ...

  9. 使用 IDEA和Maven 整合SSH框架

    1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操 ...

  10. Spring简单的REST例子

    控制器处理 HTTP 的4个主要方法 GET,POST,PUT,DELETE 使用@PathVariable注解获取URL中的参数 import javax.inject.Inject; import ...