题目

小 $\omega $ 想要进行烟火表演,她一开始有\(n\)颗彗星和\(n\)颗陨石

  • 如果小 \(\omega\) 有\(i\)颗彗星而没有陨石,那么她会消耗\(i\)颗彗星并得到\(a_i\)的火焰

  • 如果小 \(\omega\) 有\(j\)颗陨石而没有彗星,那么她会消耗\(j\)颗陨石并得到\(a_j\)的火焰

  • 否则小 \(\omega\) 有 \(p\) 的概率消耗一颗陨石,得到\(\alpha\)的火焰,有 \(q\) 的概率消耗一颗彗星,得到\(\beta\)的火焰

    有\((1-p-q)\)的概率丢弃掉所有材料

    设\(f_{i,j}\)表示小 \(\omega\) 有 \(i\) 颗彗星, \(j\) 颗陨石期望得到的火焰数量

    \[\sum_{i=0}^{n}\sum_{j=0}^{n} h^{i(n+1)+j} \ f_{i,j}
    \]

$ n \le 200000 $

题解

  • 设\(\gamma = p \alpha + q \beta\),得到\(f_{i,j}\)的转移式

    \[\begin{align}
    f_{i,j} \ = \ pf_{i-1,j} + qf_{i,j-1} + \gamma
    \end{align}
    \]

  • 相当于向下贡献 $\times p $ ,向右贡献 \(\times q\) ,分别考虑\(a_i,b_i,\gamma\)的贡献和

    \[\begin{align}
    ans &= \\
    &\gamma \sum_{i=1}^{n}\sum_{j=1}^{n} \sum_{x=i}^{n}\sum_{y=j}^{n} (^{x-i+y-j}_{x-i})p^{x-i}q^{y-j} h^{x(n+1)+y}\\
    +&\sum_{i=1}^{n}a_i\sum_{x=i}^{n}\sum_{y=1}^{n}(^{x-i+y-1}_{x-i})p^{x-i}q^{y}h^{x(n+1)+y}\\
    +&\sum_{j=1}^{n}b_j\sum_{x=1}^{n}\sum_{y=j}^{n}(^{x-1+y-j}_{y-j})p^{x}q^{y-j}h^{x(n+1)+y}\\
    +&\sum_{i=1}^{n}a_ih^{i(n+1)} + b_{i}h^i \\
    \end{align}
    \]

  • 考虑前三项,交换求和顺序分别是:

    \[\begin{align}
    &\sum_{x=0}^{n}\sum_{y=0}^{n}(^{x+y}_x)p^xq^y(\sum_{i=x+1}^{n}h^{i(n+1)})(\sum_{j=y+1}^{n}h^{j}) \\
    &\sum_{x=0}^{n}\sum_{y=1}^{n}(^{x+y-1}_{x}) p^xq^y (\sum_{i=x+1}^{n}a_{i-x}h^{i(n+1)})h^y \\
    &\sum_{x=1}^{n}\sum_{y=0}^{n}(^{x-1+y}_{y}) p^xq^y h^{x(n+1)} (\sum_{j=y+1}^{n}b_{j-y}h^j) \\
    \end{align}
    \]

  • 拆开组合数可以直接看成关于\(x,y\)的卷积

  • 第一个式子的系数直接预处理,第二个式子的系数可以预先做一遍卷积

  • 话说我有些细节推错了好多遍........

Code

//JZOJ锅掉了,暂时只知道这份代码能跑过大样例

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
#define G 3
using namespace std;
const int N=1<<19;
int n,h,p,q,ta,tb,r,a[N],b[N],tx,ty,dx,dy,A[6][N],B[3][N],fac[N],inv[N],ny[N];
int hx[N],hy[N],sx[N],sy[N],sa[N],sb[N],rev[N],len,L,ans;
char gc(){
static char*p1,*p2,s[1000000];
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
return x;
}
int pw(int x,int y){
int re=1;if(y<0)y+=mod-1;
for(;y;y>>=1,x=1ll*x*x%mod)
if(y&1)re=1ll*re*x%mod;
return re;
}
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
int pls(int x,int y){int re=x+y;return re>=mod?re-mod:re;}
int mis(int x,int y){int re=x-y;return re<0?re+mod:re;}
void ntt(int*F,int sg){
for(int i=0;i<len;++i)if(i<rev[i])swap(F[i],F[rev[i]]);
for(int i=1;i<len;i<<=1){
int wn=pw(G,sg*(mod-1)/i/2);
for(int j=0;j<len;j+=i<<1){
int w=1;
for(int k=0;k<i;++k,w=(ll)w*wn%mod){
int x=F[j+k],y=(ll)w*F[j+k+i]%mod;
F[j+k]=pls(x,y);F[j+k+i]=mis(x,y);
}
}
}
if(!~sg){
int iv=pw(len,mod-2);
for(int i=0;i<len;++i)F[i]=(ll)F[i]*iv%mod;
}
}
int main(){
freopen("dream.in","r",stdin);
freopen("dream2.out","w",stdout);
n=rd();h=rd();ta=rd();tb=rd();
p=rd();p=(ll)p*pw(rd(),mod-2)%mod;
q=rd();q=(ll)q*pw(rd(),mod-2)%mod;
r=((ll)p*ta+(ll)q*tb)%mod;
for(int i=1;i<=n;++i)a[i]=rd();
for(int i=1;i<=n;++i)b[i]=rd();
ty=pw(h,n+1),tx=pw(ty,n+1);
dy=pw(h,mod-2),dx=pw(ty,mod-2);
for(int i=n;i;--i){
sx[i]=hx[i]=tx=(ll)tx*dx%mod;
sy[i]=hy[i]=ty=(ll)ty*dy%mod;
inc(sx[i],sx[i+1]);
inc(sy[i],sy[i+1]);
inc(ans,((ll)hx[i]*a[i]+(ll)hy[i]*b[i])%mod);
}
ny[1]=1;for(int i=2;i<=n<<1;++i)ny[i]=(ll)(mod-mod/i)*ny[mod%i]%mod;
for(int i=fac[0]=inv[0]=1;i<=n<<1;++i){
inv[i]=1ll*inv[i-1]*ny[i]%mod;
fac[i]=1ll*fac[i-1]*i%mod;
} for(L=0,len=1;len<=n<<1;len<<=1,L++);
for(int i=0;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1)); for(int i=1,tp=1,tq=1;i<=n;++i){
A[2][i-1]=(ll)tp*sx[i]%mod*inv[i-1]%mod;
A[3][i-1]=(ll)tq*sy[i]%mod*inv[i-1]%mod;
tp=(ll)tp*p%mod;tq=(ll)tq*q%mod;
A[0][i-1]=(ll)tp*hx[i]%mod*inv[i-1]%mod;
A[1][i-1]=(ll)tq*hy[i]%mod*inv[i-1]%mod;
} reverse(a,a+n+1);reverse(b,b+n+1);
ntt(a,1);ntt(b,1);ntt(hx,1);ntt(hy,1);
for(int i=0;i<len;++i){
a[i]=(ll)a[i]*hx[i]%mod;
b[i]=(ll)b[i]*hy[i]%mod;
}
ntt(a,-1);ntt(b,-1);//ntt(hx,-1);ntt(hy,-1);
for(int i=0,tp=1,tq=1;i<=n;++i){
A[4][i]=(ll)tp*a[n+i]%mod*inv[i]%mod;
A[5][i]=(ll)tq*b[n+i]%mod*inv[i]%mod;
tp=(ll)tp*p%mod;tq=(ll)tq*q%mod;
} for(int i=0;i<6;++i)ntt(A[i],1);
for(int i=0;i<len;++i){
// B[0][i]=(ll)A[2][i]*A[3][i]%mod;
// B[1][i]=(ll)A[4][i]*A[1][i]%mod;
// B[2][i]=(ll)A[0][i]*A[5][i]%mod;
B[0][i]=((ll)A[2][i]*A[3][i]%mod*r+(ll)A[4][i]*A[1][i]+(ll)A[0][i]*A[5][i])%mod;
}
//for(int i=0;i<3;++i)ntt(B[i],-1);
ntt(B[0],-1);
for(int i=0;i<=n<<1;++i){
//inc(ans , ((ll)r*B[0][i] + B[1][i] + B[2][i])%mod * fac[i] %mod);
inc(ans , (ll)B[0][i]*fac[i]%mod);
}
cout<<ans<<endl;
return 0;
}

【JZOJ5740】【20190706】幻想世界的更多相关文章

  1. 【JZOJ5739】【20190706】毒奶

    题目 有\(n\)个现实城市,另有\(n\)个幻想城市 原图中在现实城市存在\(m\)条边,在幻想城市存在\(m-1-n\)条边 一个排列是合法的当且进当显示城市 \(i\) 向幻想城市 \(p_i\ ...

  2. 【JZOJ5738】【20190706】锁屏杀

    题目 $n \le 2000 $ 题解 \(B\)的数字可以对1440取模,对三个图分别进行\(dp\)即可 时间复杂度\(O(n\times 1440 \times 10)\) Code #incl ...

  3. 2019-07-06 sql 连续出现次数

    由手机通讯记录界面想到的问题 SELECT CASE WHEN AA.num=1 THEN AA.Tel ELSE AA.Tel+'('+CASt(AA.num AS VARCHAR(4))+')' ...

  4. 2019-07-06 sql备忘 连续取最大

    连续最大: SELECT M.* FROM #temp MINNER JOIN (SELECT ISNULL(A.score,0)-b.score AS score,B.id FROM #temp A ...

  5. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

  6. js+CSS实现模拟华丽的select控件下拉菜单效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. HTML5 CSS3专题 诱人的实例 CSS3打造百度贴吧的3D翻牌效果

    首先感谢w3cfuns的老师~ 今天给大家带来一个CSS3制作的翻牌效果,就是鼠标移到元素上,感觉可以看到元素背后的信息.大家如果制作考验记忆力的连连看.扑克类的游戏神马的,甚至给女朋友写一些话语,放 ...

  8. DOIS 2019 DevOps国际峰会北京站来袭~

    DevOps 国际峰会是国内唯一的国际性 DevOps 技术峰会,由 OSCAR 联盟指导.DevOps 时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈 DevOps 体系与方法.过程与 ...

  9. 模拟select控件,css模拟下拉

    <!DOCTYPE html > <head>     <meta http-equiv="Content-Type" content="t ...

随机推荐

  1. CountDownLatch 源码分析

    CountDownLatch 源码分析: 1:CountDownLatch数据结构 成员变量 Sync类型对象 private final Sync sync; Sync是继承AQS的一个类,Coun ...

  2. 你知道Object中有哪些方法及其作用吗?

    一.引言二.Object方法详解1.1.registerNatives()1.2.getClass()1.2.1.反射三种方式:1.3.hashCode()1.4.equals()1.4.clone( ...

  3. Python '\r', '\n', '\r\n' 的彻底理解

    回车和换行的历史: 机械打字机有回车和换行两个键作用分别是: 换行就是把滚筒卷一格,不改变水平位置.   (即移到下一行,但不是行首,而是和上一行水平位置一样) 回车就是把水平位置复位,不卷动滚筒.  ...

  4. nginx 的一些优化(突破十万并发)

    一般来说 nginx 配置文件中对优化比较有作用的为以下几项: worker_processes 8; nginx 进程数,建议按照 cpu 数目来指定,一般为它的倍数. worker_cpu_aff ...

  5. 手写LRU实现

    完整基于 Java 的代码参考如下 class DLinkedNode { String key; int value; DLinkedNode pre; DLinkedNode post; } LR ...

  6. IdentityService4学习笔记之Client Credentials

    IdentityService4简介 一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制. 前文 今天介绍ClientCredentials认证类型,适用 ...

  7. idea更改之前保存的git账号和密码

    1.打开控制面板 2.用户账户 3.管理windows凭据 4.点击里面的git就可以修改了

  8. sql 按指定规则排序,例如 按 1,3,2排序 而不是1,2,3

    我们都知道 sql语句中的排序有desc(降序).asc(升序),这两个都是按顺序排列的,最近有一个需求是不按顺序排序了 ,抽出个别的排在前面,并且这种需求是应对的问题中的数据是比较少的,而且没有规律 ...

  9. JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格

    JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...

  10. DevOps 转型到底难不难(转自成哥的世界)

    原文:https://mp.weixin.qq.com/s/QwZf6ZsKGNT6YyereSmpQg DevOps 自 2009 年诞生以来,至今整整过去了十年,从最初的摸索,逐步变成一种主流的软 ...