题目

显然这个题的期望就是逗你玩的,我们算出来总贡献除以\(nm\)就好了

设\(ans_t=\sum_{i=1}^n\sum_{j=1}^n(a_i+b_j)^t\)

二项式定理展开一下

\[ans_t=t!\sum_{i=0}^t\frac{\sum_{j=1}^na_j^i}{i!}\frac{\sum_{j=1}^mb_j^{t-i}}{(t-i)!}
\]

我们构造两个多项式\(A,B\)

\[A(x)=\sum_{i=1}^na_i^x,B(x)=\sum_{i=1}^mb_i^x
\]

显然这两个多项式一卷就是答案了

现在的问题就是求\(A\)和\(B\)了

考虑一下生成函数

显然\(A\)的生成函数就是每一个\(a_i\)的生成函数的和

对于一个\(a_i\)其生成函数显然是\(\frac{1}{1-a_ix}\)

于是

\[A=\sum_{i=1}^n\frac{1}{1-a_ix}
\]

暴力加显然是不行的,我们考虑到这些个多项式尽管每一个都是分式但是次数都是\(1\),于是我们可以分治做这个加法,就是合并左右两边的时候先通分再做加法,复杂度是\(O(nlog^2n)\)的

代码

#include<vector>
#include<cstdio>
#include<cstring>
#define re register
#define pb push_back
#define max(a,b) ((a)>(b)?(a):(b))
const int maxn=262144+5;
const int mod=998244353;
const int G[2]={3,(mod+1)/3};
int a[maxn],b[maxn],c[maxn],d[maxn],g[maxn],h[maxn],H[maxn],K[maxn],C[maxn];
int n,len,rev[maxn],m,T,fac[maxn],__[2][100],ifac[maxn],inv[maxn],A[2][maxn>>1];
std::vector<int> q[2][maxn],p[2][maxn];
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
inline int ksm(int a,int b) {
int S=1;for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;return S;
}
inline void NTT(int *f,int o) {
for(re int i=0;i<len;i++) if(i<rev[i]) std::swap(f[i],f[rev[i]]);
for(re int og1,p=0,i=2,ln=1;i<=len;i<<=1,ln<<=1,++p) {
if(!__[o][p]) og1=__[o][p]=ksm(G[o],(mod-1)/i);else og1=__[o][p];
for(re int t,og=1,l=0;l<len;l+=i,og=1)
for(re int x=l;x<l+ln;++x) {
t=1ll*og*f[x+ln]%mod;og=1ll*og*og1%mod;
f[x+ln]=(f[x]-t+mod)%mod,f[x]=(f[x]+t)%mod;
}
}
if(!o) return;
int Inv=ksm(len,mod-2);
for(re int i=0;i<len;i++) f[i]=1ll*f[i]*Inv%mod;
}
inline void Inv(int n,int *A,int *B) {
if(n==1) {B[0]=ksm(A[0],mod-2);return;}
Inv((n+1)>>1,A,B);
len=1;while(len<n+n-1) len<<=1;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
for(re int i=0;i<n;i++) C[i]=A[i];
for(re int i=n;i<len;i++) C[i]=0;NTT(C,0),NTT(B,0);
for(re int i=0;i<len;i++) B[i]=(2ll*B[i]-1ll*C[i]*B[i]%mod*B[i]%mod+mod)%mod;
NTT(B,1);for(re int i=n;i<len;i++) B[i]=0;
}
void cdq(int l,int r,int o,int t) {
if(l==r) {q[o][t].pb(1);q[o][t].pb(mod-A[o][l]);p[o][t].pb(1);return;}
int mid=l+r>>1;cdq(l,mid,o,t<<1),cdq(mid+1,r,o,t<<1|1);
len=1;while(len<=r-l+1) len<<=1;
for(re int i=0;i<len;i++) g[i]=h[i]=a[i]=b[i]=c[i]=d[i]=0;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
for(re int i=0;i<q[o][t<<1].size();i++) a[i]=q[o][t<<1][i];
for(re int i=0;i<p[o][t<<1].size();i++) c[i]=p[o][t<<1][i];
for(re int i=0;i<q[o][t<<1|1].size();i++) b[i]=q[o][t<<1|1][i];
for(re int i=0;i<p[o][t<<1|1].size();i++) d[i]=p[o][t<<1|1][i];
NTT(a,0),NTT(b,0),NTT(c,0),NTT(d,0);
for(re int i=0;i<len;i++) g[i]=1ll*a[i]*b[i]%mod;
for(re int i=0;i<len;i++) h[i]=(1ll*a[i]*d[i]%mod+1ll*b[i]*c[i]%mod)%mod;
NTT(g,1),NTT(h,1);
for(re int i=0;i<r-l+1;i++) p[o][t].pb(h[i]);
for(re int i=0;i<=r-l+1;i++) q[o][t].pb(g[i]);
}
int main() {
n=read(),m=read();inv[1]=1;ifac[0]=1;fac[0]=1;
for(re int i=1;i<=n;i++) A[0][i]=read();
for(re int i=1;i<=m;i++) A[1][i]=read();
cdq(1,n,0,1),cdq(1,m,1,1);T=read();
for(re int i=2;i<=T;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(re int i=1;i<=T;i++) fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
memset(a,0,sizeof(a)),memset(b,0,sizeof(b));
memset(c,0,sizeof(c)),memset(d,0,sizeof(d));
for(re int i=0;i<p[0][1].size();i++) a[i]=p[0][1][i];
for(re int i=0;i<p[1][1].size();i++) b[i]=p[1][1][i];
for(re int i=0;i<q[0][1].size();i++) c[i]=q[0][1][i];
for(re int i=0;i<q[1][1].size();i++) d[i]=q[1][1][i];
Inv(T+1,c,H),Inv(T+1,d,K);
int U=max(n,m);U=max(U,T);
len=1;while(len<=T+U) len<<=1;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
NTT(a,0),NTT(b,0),NTT(H,0),NTT(K,0);
for(re int i=0;i<len;i++) a[i]=1ll*a[i]*H[i]%mod;
for(re int i=0;i<len;i++) b[i]=1ll*b[i]*K[i]%mod;
NTT(a,1),NTT(b,1);
for(re int i=T+1;i<len;i++) a[i]=b[i]=0;
for(re int i=0;i<=T;i++) a[i]=1ll*a[i]*ifac[i]%mod;
for(re int i=0;i<=T;i++) b[i]=1ll*b[i]*ifac[i]%mod;
NTT(a,0),NTT(b,0);
for(re int i=0;i<len;i++) a[i]=1ll*a[i]*b[i]%mod;
NTT(a,1);
int Inv=ksm(1ll*n*m%mod,mod-2);
for(re int i=1;i<=T;i++)
printf("%d\n",1ll*Inv*a[i]%mod*fac[i]%mod);
return 0;
}

还有压行真是好看

【LGP4705】玩游戏的更多相关文章

  1. 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏

    本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...

  2. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  3. 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

    小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...

  4. cdoj 1136 邱老师玩游戏 树形背包

    邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...

  5. win7系统玩游戏不能全屏的解决办法

    1.修改注册表中的显示器的参数设置   Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置:   HKEY_LOCAL_MACHINE\SYSTEM\ ...

  6. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备

    背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...

  7. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  8. 【特殊的图+DP】【11月校赛】大家一起玩游戏

    大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  9. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  10. Luogu P4705 玩游戏

    题目描述 Alice 和 Bob 又在玩游戏. 对于一次游戏,首先 Alice 获得一个长度为 ​ 的序列 ​,Bob 获得一个长度为 ​ 的序列 bb.之后他们各从自己的序列里随机取出一个数,分别设 ...

随机推荐

  1. python 取出aws中ip有,zabbix中没有的ip

    #!/usr/bin/env python3# coding=utf-8import requestsimport jsonimport boto3 headers = {'Content-Type' ...

  2. note : Get FilePathName from FILE_OBJECT

    转自:http://blog.csdn.net/lostspeed/article/details/11738311 封了一个函数, 从 FILE_OBJECT 中 得到 FilePathName 在 ...

  3. MySQL - 锁等待超时与information_schema的三个表

    引用地址:https://blog.csdn.net/J080624/article/details/80596958 回顾一下生产中的一次MySQL异常,Cause: java.sql.SQLExc ...

  4. RAKsmart新出香港服务器的优势

    RAKsmart为了更好地服务用户,所以最近RAKsmart新推出得香港服务器又带给了用户更多的选择,那这次RAKsmart新推出香港服务器有哪些优势呢? 1.带宽更大可升至10Mpbs 香港服务器的 ...

  5. JAVA数据结构之红-黑树

    本篇博客我会重点介绍对红-黑树的理解,重点介绍红-黑树的查找,这里我们将要讨论的算法称为自顶向下插入,也就是把沿着树向下查找插入点 Ⅰ.平衡树和非平衡树 平衡树和非平衡树:当插入一组数据关键字是按照升 ...

  6. ReentrantLock中的公平锁与非公平锁

    简介 ReentrantLock是一种可重入锁,可以等同于synchronized的使用,但是比synchronized更加的强大.灵活. 一个可重入的排他锁,它具有与使用 synchronized ...

  7. 【JZOJ6384】珂学家

    description analysis 注意配出来的饮料不可以再配成其他饮料,所以肯定有\(O(n^2)\)的枚举 而且可口度两两互不相同,搞得我以为这是神仙题 考虑把两个试剂\([l_1,r_1] ...

  8. js对象 事件

     对象  创建  var   myObject = {};/* 声明对象字面变量*/ 添加值myObject.name="Jener";myObject.age=25; 代码格式 ...

  9. DNS的解析过程

    1.什么是DNS 在互联网上,唯一标识一台计算机的是IP地址,但是IP地址不方便记忆,通过一个域名对应一个IP地址,来达到找到IP地址的目的,那么DNS就是将域名转换成IP地址的过程. 2.DNS查询 ...

  10. 扩展gcd求逆元

    当模数为素数时可以用费马小定理求逆元. 模数为合数时,费马小定理大部分情况下失效,此时,只有与模数互质的数才有逆元(满足费马小定理的合数叫伪素数,讨论这个问题就需要新开一个博客了). (对于一个数n, ...