题面在这里

description

对于\(k=1,2,...,t\),求$$\frac{1}{nm}\sum_{i=1}{n}\sum_{j=1}{m}(a_i+b_j)^k$$

对\(998244353\)取模。

data range

\[1\le n,m,k\le 10^5,0\le a_i,b_i\le 998244352
\]

solution

由于要求多项式

\[\begin{aligned}
Ans(x)&=\sum_{k=1}^{t}\sum_{i=1}^{n}\sum_{j=1}^{m}(a_i+b_j)^kx^k\\
&=\sum_{k=1}^{t}\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{s=1}^{k}\binom{k}{s}a_i^sb_j^{k-s}x^k\\
&=\sum_{k=1}^{t}k!\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{s=1}^{k}\frac{a_i^s}{s!}\frac{b_j^{k-s}}{(k-s)!}x^k\\
&=\sum_{k=1}^{t}k!\sum_{s=1}^{k}(\sum_{i=1}^{n}\frac{a_i^s}{s!})(\sum_{j=1}^{m}\frac{b_j^{k-s}}{(k-s)!})x^k\\
&=\sum_{k=1}^{t}k!\sum_{s=1}^{k}\frac{\sum_{i=1}^{n}a_i^s}{s!}\frac{\sum_{j=1}^{m}b_j^{k-s}}{(k-s)!}x^k\\
\end{aligned}\]

我们记

\[f_k(x)=\sum_{s=1}^{k}\frac{\sum_{i=1}^{n}a_i^s}{s!}\frac{\sum_{j=1}^{m}b_j^{k-s}}{(k-s)!}x^s
\]

则$$Ans(x)=\sum_{k=1}{t}f_k(1)xk$$

即其系数的前缀和

于是现在我们要求出$$g_a(x)=\sum_{i=1}{t}\sum_{j=1}{n}a_jixi$$

构造函数\(h(x)=\prod_{i=1}^{n}(a_ix+1)\),因为

\[ln[h(x)]=\sum_{i=1}^{n}ln(a_ix+1)
\]

而

\[ln'(a_ix+1)=\frac{a_i}{a_ix+1}=\sum_{j=1}^{\infty}(-1)^ja_i^{j+1}x^j
\]

对上面这个式子求积分,我们有

\[ln(a_ix+1)=\sum_{j=1}^{\infty}(-1)^{j-1}\frac{a_i^j}{j}x^j
\]

于是我们有

\[\begin{aligned}
ln[h(x)]&=\sum_{i=1}^{n}\sum_{j=1}^{\infty}(-1)^{j-1}\frac{a_i^j}{j}x^j\\
&=\sum_{j=1}^{\infty}(-1)^{j-1}\frac{\sum_{i=1}^{n}a_i^j}{j}x^j\\
\end{aligned}\]

\(h(x)\)我们可以使用分治\(FFT\)在\(O(nlog^2n)\)的时间内求出;

\(ln[h(x)]\)可以使用多项式求\(ln\)在\(O(nlogn)\)的时间内求出,

系数稍加处理即可得到\(g_a(x)\)和\(g_b(x)\);

最后将\(g_a(x)\)和\(g_b(x)\)做一遍\(NTT\)即可得到\(f(x)\)。

总时间复杂度为\(O(nlog^2n)\)

常数巨大

调试\(3+day\)后终于过了第二个样例

code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#define RG register
#define il inline
using namespace std;
typedef long long ll;
typedef double dd;
const int N=400010;
const int mod=998244353;
const dd pi=acos(-1);
il int read(){
RG int d=0,w=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=1,ch=getchar();
while(ch>='0'&&ch<='9')d=(d<<3)+(d<<1)+(ch^48),ch=getchar();
return w?-d:d;
} il int poww(int a,int b){
RG int ret=1;
for(;b;b>>=1,a=1ll*a*a%mod)
if(b&1)ret=1ll*ret*a%mod;
return ret;
} int r[N];
il void NTT(int *a,int n,int opt){
for(RG int i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
for(RG int i=2;i<=n;i<<=1){
RG int wn=poww((opt==1)?3:((mod+1)/3),(mod-1)/i);
for(RG int j=0;j<n;j+=i){
RG int w=1;
for(RG int k=j;k<j+(i>>1);k++,w=1ll*w*wn%mod){
RG int x=1ll*a[k+(i>>1)]*w%mod;
a[k+(i>>1)]=(a[k]-x+mod)%mod;
a[k]=(a[k]+x)%mod;
}
}
}
if(opt==-1)
for(RG int i=0,rev=poww(n,mod-2);i<n;i++)
a[i]=1ll*a[i]*rev%mod;
} int inv[N];
il void initinv(int n){
inv[0]=inv[1]=1;
for(RG int i=2;i<n;i++)inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
} int x[N],y[N]; #define M ((L+R)>>1)
void solve(int *a,int L,int R){//分治FFT
if(L==R)return;solve(a,L,M);solve(a,M+1,R);
RG int n=M-L+1,m=R-M,len=1,l=0;
for(;len<=(n+m);len<<=1,l++);
for(RG int i=0;i<len;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1)); for(RG int i=0;i<len;i++)x[i]=y[i]=0;x[0]=y[0]=1;
for(RG int i=1;i<=n;i++)x[i]=a[L+i-1];
for(RG int i=1;i<=m;i++)y[i]=a[M+i]; NTT(x,len,1);NTT(y,len,1);
for(RG int i=0;i<len;i++)x[i]=1ll*x[i]*y[i]%mod;
NTT(x,len,-1); for(RG int i=1;i<=n+m;i++)a[L+i-1]=x[i];
} il void getdao(int *a,int *x,int n){//多项式求导
for(RG int i=0;i<n;i++)x[i]=1ll*a[i+1]*(i+1)%mod;x[n-1]=0;
}
il void getjifen(int *a,int *x,int n){//多项式求积分
for(RG int i=n-1;i;i--)x[i]=1ll*a[i-1]*inv[i]%mod;x[0]=0;
} int xi[N],yi[N];
void getinv(int *f,int *g,int n,int l){//多项式求逆
if(n==1){g[0]=poww(f[0],mod-2);return;}getinv(f,g,n>>1,l-1);
for(RG int i=0;i<(n<<1);i++)r[i]=(r[i>>1]>>1)|((i&1)<<l);
for(RG int i=0;i<(n<<1);i++)xi[i]=yi[i]=0; for(RG int i=0;i<n;i++)xi[i]=f[i];
for(RG int i=0;i<(n>>1);i++)yi[i]=g[i]; NTT(xi,n<<1,1);NTT(yi,n<<1,1);
for(RG int i=0;i<(n<<1);i++)
xi[i]=1ll*(2-1ll*xi[i]*yi[i]%mod+mod)%mod*yi[i]%mod;
NTT(xi,n<<1,-1);
for(RG int i=0;i<n;i++)g[i]=xi[i];
} void getln(int *a,int *f,int n,int l){//多项式求ln
memset(x,0,sizeof(x));memset(y,0,sizeof(y));
getdao(a,x,n);getinv(a,y,n,l);
for(RG int i=0;i<(n<<1);i++)r[i]=(r[i>>1]>>1)|((i&1)<<l);
NTT(x,n<<1,1);NTT(y,n<<1,1);
for(RG int i=0;i<(n<<1);i++)x[i]=1ll*x[i]*y[i]%mod;
NTT(x,n<<1,-1);
getjifen(x,f,n);
} int n,m,t,a[N],b[N],f[N],g[N],l,rv;
int main()
{
n=read();m=read();rv=1ll*poww(n,mod-2)*poww(m,mod-2)%mod;
for(RG int i=1;i<=n;i++)a[i]=read();
for(RG int i=1;i<=m;i++)b[i]=read();
solve(a,1,n);solve(b,1,m);//分治FFT得到h(x); t=read();a[0]=b[0]=1;
for(l=0;(1<<l)<=t;l++);initinv(1<<l);
getln(a,f,(1<<l),l);getln(b,g,(1<<l),l); for(RG int i=1;i<=t;i++){
f[i]=(i&1)?(1ll*f[i]*i%mod):((mod-1ll*f[i]*i%mod)%mod);
g[i]=(i&1)?(1ll*g[i]*i%mod):((mod-1ll*g[i]*i%mod)%mod);
}
//多项式求ln得到ga(x)和gb(x); for(RG int i=1;i<=t;i++){
inv[i]=1ll*inv[i-1]*inv[i]%mod;
f[i]=1ll*f[i]*inv[i]%mod;
g[i]=1ll*g[i]*inv[i]%mod;
} f[0]=n;g[0]=m;m=n=t;
for(m+=n,n=1,l=0;n<=m;l++,n<<=1);
for(RG int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
NTT(f,n,1);NTT(g,n,1);
for(RG int i=0;i<n;i++)f[i]=1ll*f[i]*g[i]%mod;
NTT(f,n,-1); for(RG int i=1,fac=1;i<=t;i++,fac=1ll*fac*i%mod){
f[i]=1ll*f[i]*fac%mod;
printf("%lld\n",1ll*f[i]*rv%mod);
}
return 0;
}

[LouguT30212]玩游戏的更多相关文章

  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}^ ...

随机推荐

  1. 【完美解决】Spark-SQL、Hive多 Metastore、多后端、多库

    [完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 [完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 SparkSQL 支持同时连接多种 Meta ...

  2. Windows运行机理——创建窗口

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 Windows 窗口在创建之前,其属性必须设定好,所谓属性包括类的名字 ...

  3. appium -- 页面出现弹窗,关闭后,无法识别页面元素

    1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发现 driver.getPageSource()获取不到页面元素.在找了一圈无用的资料后,没有什么好的处 ...

  4. [JSON].getObj( keyPath )

    语法:[JSON].getObj( keyPath ) 返回:[JSON] 说明:返回指定键名路径的JSON对象,指定键名路径不存在时返回空的toJson对象(强烈建议使用 [JSON].exists ...

  5. 【input】输入框组件说明

    input输入框组件 原型: <input value="[String]" type="[text | number | idcard | digit]" ...

  6. 标注点(Labeled Point)

    标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...

  7. Java基础知识:Java实现Map集合二级联动1

    Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...

  8. The Activation Function in Deep Learning 浅谈深度学习中的激活函数

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...

  9. Ext JS 6学习文档–第2章–核心概念

    核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...

  10. JS判断是IOS还是Android以及如何解决h5打包后在ios下内容与状态栏重叠问题

    h5打包后在ios下内容与状态栏重叠问题: 1:知道设备的类型: var u = navigator.userAgent, app = navigator.appVersion; var isAndr ...