[Contest20180405]抑制「超我」
古明地恋(koishi)和计算器(calculator)是好朋友。
恋恋有一个神奇的计算器,可以进行两个数在模$2^n$意义下的加法运算。计算器上有一个寄存器,一开始寄存器中的数为$0$,每当恋恋输入一个数,计算器就会把寄存器中的值与输入的数相加,并存在寄存器中(覆盖原有的值)。
计算器内部采用二进制进行数的存储,两个数相加时,它会按照二进制加法的规则,从低位到高位依次相加、进位,并舍弃掉最后多出来的第$n+1$位。由于年久失修,计算器上的某些数位出了点小故障,这些数位上不会发生进位。也就是说,在加法的过程中,如果这个数位上的值超过了$1$,它会对$2$取模,而下一个数位却不会$+1$(显然第$n$位是否故障并没有多大区别,为了方便我们钦定它一定故障)。
恋恋会不停地向计算器输入数字。每次,她会在$[0,2^n)$的范围内随机选取一个数进行输入。这里每个数被选取的概率与它的数值大小成正比,也就是说,$x$被选中的概率为$\begin{align*}\dfrac x{\sum\limits_{i=0}^{2^n−1}i}\end{align*}$。每当恋恋输入完一个数,她会有$\dfrac{998244354−p}{998244354}$的概率感到厌倦,否则她会继续重复这一过程,直到她厌倦为止。现在,恋恋想知道在她感到厌倦之后,寄存器中的数的期望值是多少,答案对$998244353$取模。
每一段$0\cdots01$互不影响,可以分开计算答案,假设当前要计算一段长度为$m$的区间的答案
设$p_i$表示输入$i$的概率,构造多项式$\begin{align*}A(x)=\sum\limits_{i=0}^\infty p_ix^i\end{align*}$,那么$[x^k]\begin{align*}\sum\limits_{i=0}^\infty(1-p)p^iA^{i+1}(x)\end{align*}$就是最后和为$k$的概率(枚举恋恋在第$i$次加法时停止)注意这里的下标要模$2^m$,也就是说多项式乘法是循环卷积
等比数列求和一下,我们得到答案为$[x^k]\dfrac{(1-p)A(x)}{1-pA(x)}$,因为是循环卷积,所以直接用点值计算是可行的,就不用写多项式求逆了
#include<stdio.h> #include<string.h> const int mod=998244353; typedef long long ll; int mul(int a,int b){return a*(ll)b%mod;} int ad(int a,int b){return(a+b)%mod;} int de(int a,int b){return(a-b)%mod;} void inc(int&a,int b){a=ad(a,b);} int pow(int a,int b){ int s=1; while(b){ if(b&1)s=mul(s,a); a=mul(a,a); b>>=1; } return s; } int rev[1100010],N,iN; void pre(int n){ int i,k; for(N=1,k=0;N<n;N<<=1)k++; for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1)); iN=pow(N,mod-2); } void swap(int&a,int&b){a^=b^=a^=b;} void ntt(int*a,int on){ int i,j,k,t,w,wn; for(i=0;i<N;i++){ if(i<rev[i])swap(a[i],a[rev[i]]); } for(i=2;i<=N;i<<=1){ wn=pow(3,(on==1)?(mod-1)/i:(mod-1-(mod-1)/i)); for(j=0;j<N;j+=i){ w=1; for(k=0;k<i>>1;k++){ t=mul(w,a[i/2+j+k]); a[i/2+j+k]=de(a[j+k],t); inc(a[j+k],t); w=mul(w,wn); } } } if(on==-1){ for(i=0;i<N;i++)a[i]=mul(a[i],iN); } } int f[1100010]; char s[30]; int main(){ int n,p,i,j,las,al,rl,ans; scanf("%d%d%s",&n,&p,s+1); las=0; al=(1<<n)-1; rl=pow((al+1)*(ll)al/2%mod,mod-2); ans=0; for(i=1;i<=n;i++){ if(s[i]=='1'){ pre(1<<(i-las)); memset(f,0,sizeof(f)); for(j=0;j<=al;j++)inc(f[(j&((1<<i)-1))>>las],mul(j,rl)); ntt(f,1); for(j=0;j<N;j++)f[j]=mul(mul(1-p,f[j]),pow(1-mul(p,f[j]),mod-2)); ntt(f,-1); for(j=0;j<N;j++)inc(ans,mul(j<<las,f[j])); las=i; } } printf("%d",(ans+mod)%mod); }
[Contest20180405]抑制「超我」的更多相关文章
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 如何获取iframe DOM的值
在Web开发时,很多时候会遇到一个问题.我在一个页面嵌入了iframe,并且我想获得这个iframe页面某个元素的值.那么该如何实现这个需求呢? 先来看下演示: 效果演示 iframe1中文本框的值: ...
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) A
A. Bear and Game time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 杭电hdu 2089 数位dp
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍 ...
- codeforces 1015A
A. Points in Segments time limit per test 1 second memory limit per test 256 megabytes input standar ...
- spring中<bean>中parent标签的使用
简介:spring 中parent标签是指:某个<bean>的父类.这个类可以覆盖parent的属性, 代码如下: Parent类的代码如下: package com.timo.domai ...
- MAC地址的介绍(单播、广播、组播、数据收发)
MAC地址组成 网络设备的MAC地址是全球唯一的.MAC地址长度为48比特,通常用十六进制表示.MAC地址包含两部分:前24比特是组织唯一标识符(OUI,OrganizationallyUniqueI ...
- eclipse 主题文件配置
eclipse市场搜索 Eclipse Color Theme ----用于控制文本域主题 Eclipse 4 Chrome Theme chrome风格的主题 最新的:Jeeeyul's Them ...
- Web项目中加载Spring配置的常用方法
1.web.xml中添加配置 <web-app> <context-param> <param-name>contextConfigLoc ...
- Flex UI刷新后保持DataGrid中的ScrollBar的位置不变
这是之前我发的一个贴子问题描述:http://q.cnblogs.com/q/53469/
- Spring 对象的声明与注入
1.怎么把一个对象该过过交给Spring管理? 1)通过xml中配置<bean>节点来声明 2)通过Spring注解来声明,如:@Service.@Repository.@Componen ...