[JZOJ6340] 【NOIP2019模拟2019.9.4】B
题目
题目大意
给你个非负整数数列\(a\),每次等概率选择大于零的\(a_i\),使其减\(1\)。
问\(a_1\)被减到\(0\)的时候期望经过多少次操作。
思考历程
对于这题的暴力做法,显然可以状态压缩吧……
然后我突然意识到,实际上我们将题目转化成以下模型:
有\(n\)种颜色,第\(i\)种颜色的小球有\(a_i\)个。那么题目就变成了一个有重复元素的排列问题。
先将\(2\)到\(n\)排列求出来,然后考虑将\(1\)随机插入。
枚举最后一个\(1\)出现的位置,然后在前面用组合数计算插入的方案数。
这个做法打出来之后一直没有调出来,也不知道是我数学功底不好还是这个方法本来就是错的……
当然,即便是对的,也不会是满分做法。
正解
根据期望的线性性,题目可以转化为:对于每个\(i>1\),\(a_1\)减到\(0\)的时候\(a_i\)期望取了多少个。然后将每个\(i\)的这东西加起来,再加上\(a_1\),就是答案。
于是我们就只需要考虑这个问题。
接着就是最骚的操作:我们只考虑\(a_1\)和\(a_i\),其它被减掉对它们没有影响。它们有相等的概率被减\(1\),这个概率可以看做是\(\frac{1}{2}\)。于是相当于题目中\(n=2\)的情况。
现在考虑一个平面,一开始的坐标为\((a_1,a_i)\),每次随机地向下面或者左边走一格。
如果到达边界\((0,y)\),则会有\(a_i-y\)的贡献;如果到达边界\((x,0)\),则会有\(a_i\)的贡献。
对于边界\((0,y)\),设向下走了\(j\)步,则概率为\(\frac{C_{a_1+j-1}^{j}}{2^{a_1+j}}\)。
对于边界\((x,0)\),既然它们的贡献都一样,不妨将上面的和用\(1\)减掉,就是它的概率。
接着就可以列出一个式子……
列出之后容易发现,\((a_1,a_i+1)\)的答案可以\(O(1)\)地从\((a_i,a_i)\)转移过来。
代码
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
#define N 500010
#define A 500010
#define mo 323232323
inline int input(){
char ch=getchar();
while (ch<'0' || '9'<ch)
ch=getchar();
int x=0;
do{
x=x*10+ch-'0';
ch=getchar();
}
while ('0'<=ch && ch<='9');
return x;
}
int n,a[N];
int fac[N+A],invf[N+A],inv2[N+A];
int ans1[A*3],ans2[A*3],ans[A*3];
inline int inv(int x){
int res=1;
for (int y=mo-2;y;y>>=1,x=(long long)x*x%mo)
if (y&1)
res=(long long)res*x%mo;
return res;
}
inline int C(int m,int n){return (long long)fac[m]*invf[n]%mo*invf[m-n]%mo;}
int main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
n=input();
for (int i=1;i<=n;++i)
a[i]=input();
fac[0]=1,inv2[0]=1;
for (int i=1;i<=A*2;++i){
fac[i]=(long long)fac[i-1]*i%mo;
inv2[i]=(long long)inv2[i-1]*2%mo;
}
for (int i=0;i<=A*2;++i){
invf[i]=inv(fac[i]);
inv2[i]=inv(inv2[i]);
}
ans1[0]=ans2[0]=0;
for (int i=1;i<=A;++i){
ans1[i]=(ans1[i-1]+(long long)C(a[1]+i-2,i-1)*(i-1)%mo*inv2[a[1]+i-1]%mo)%mo;
ans2[i]=(ans2[i-1]+(long long)C(a[1]+i-2,i-1)*inv2[a[1]+i-1]%mo)%mo;
ans[i]=(ans1[i]+(long long)i*(1-ans2[i]+mo)%mo)%mo;
}
long long sum=a[1];
for (int i=2;i<=n;++i)
sum+=ans[a[i]];
printf("%lld\n",sum%mo);
return 0;
}
总结
期望的线性性真是奇妙啊……
[JZOJ6340] 【NOIP2019模拟2019.9.4】B的更多相关文章
- 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋
题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...
- 6392. 【NOIP2019模拟2019.10.26】僵尸
题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/ ...
- 6389. 【NOIP2019模拟2019.10.26】小w学图论
题目描述 题解 之前做过一次 假设图建好了,设g[i]表示i->j(i<j)的个数 那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同 从n~1染色,点i的方案 ...
- 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]
题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/ ...
- 6364. 【NOIP2019模拟2019.9.20】养马
题目描述 题解 一种显然的水法:max(0,-(点权-边权之和*2)) 这样会挂是因为在中途体力值可能会更小,所以考虑求走完每棵子树所需的至少体力值 考虑从子树往上推求出当前点的答案 设每棵子树从根往 ...
- 6362. 【NOIP2019模拟2019.9.18】数星星
题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...
- 6359. 【NOIP2019模拟2019.9.15】小ω的树(tree)(定期重构)
题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每 ...
- 【NOIP2019模拟2019.11.13】旅行 && GDKOI2018 还念(二分答案+dij)
Description: 题解: 显然满足二分性. 并且每一条边要不选l要不选r. 二分的那条链肯定要选l. 考虑有两个人在走最短路,一个人一开始必须走二分的那条链,要求第一个人走的比第二个人快. 安 ...
- 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ...
随机推荐
- ulimit - 获取和改变用户的限制设定
大纲 #include <ulimit.h> long ulimit(int cmd, long newlimit); 描述 警告: 这个函数已经被废弃. glibc 不再提供这个包含文件 ...
- GC线程是否为守护线程?
GC是垃圾收集的意思,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,从而有效的防止内存泄露.要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runti ...
- one-hot encoding与哑变量的区别
one-hot encoding与哑变量的区别 one-hot比哑变量的特征位多一位,即哑变量是精简版的one-hot,即在线性回归中用截距项来表示最后一维,但由于最初很难分辨特征的主次关系,且机器学 ...
- jeecg问题汇总
(1)使用代码生成器后记得修改spring扫描配置路径entity,dao,control control在jeecg\src\main\resources\spring-mvc.xml中配置 ent ...
- sql 左连接与右连接
假设有A,B两个表. 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID ...
- [JZOJ6359] 【NOIP2019模拟2019.9.15】小ω的树
题目 题目大意 给你一棵树,带点权和边权. 要你选择一个联通子图,使得点权和乘最小边权最大. 支持修改点权操作. 思考历程 显然,最先想到的当然是重构树了-- 重构树就是在做最大生成树的时候,当两个联 ...
- Exception一自定义异常
异常体系的根类是:Throwable Throwable: Error: 重大的问题,我们处理不了.也不需要编写代码处理.比如说内存溢出. Exception: 一般性的错误,是需要我们对编写 ...
- bzoj1006题解
[题意分析] 给你一张弦图,求图的最小染色数. [解题思路] 这篇讲稿已经讲得很详尽了.. 直接求完美消除序列,然后倒着染色即可.复杂度O(n2+nm). [参考程序] 求完美消除序列我是用的MCS( ...
- NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> #include <u ...
- (转)RSA加密解密及数字签名Java实现
转:http://my.oschina.net/jiangli0502/blog/171263?fromerr=hc4izFe2 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rives ...