[LouguT30212]玩游戏
题面在这里
description
对于\(k=1,2,...,t\),求$$\frac{1}{nm}\sum_{i=1}{n}\sum_{j=1}{m}(a_i+b_j)^k$$
对\(998244353\)取模。
data range
\]
solution
由于要求多项式
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}\]
我们记
\]
则$$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}\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]玩游戏的更多相关文章
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
		
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
 - bzoj4730: Alice和Bob又在玩游戏
		
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
 - 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
		
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
 - cdoj 1136 邱老师玩游戏 树形背包
		
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
 - win7系统玩游戏不能全屏的解决办法
		
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
 - 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
		
背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...
 - UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
		
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
 - 【特殊的图+DP】【11月校赛】大家一起玩游戏
		
大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
 - 洛谷 P4705 玩游戏 解题报告
		
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
 
随机推荐
- CF 1033 C. Permutation Game
			
C. Permutation Game http://codeforces.com/contest/1033/problem/C 题意: 一个排列,每个位置i走到的位置j满足:a[j]>a[i] ...
 - Mysql 8.0.* zip版本 windows安装
			
一,MySQL8.0.*zip版本安装步骤. 1,下载 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-winx64.zip 注现 ...
 - 「题目代码」P1044~P1048(Java)
			
P1044 谭浩强C语言(第三版)习题5.8 import java.util.*; import java.io.*; import java.math.BigInteger; public cla ...
 - Selenium自动化测试第一天(上)
			
如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...
 - Android Studio|IntelliJ IDEA 常用快捷键(Mac|Window)
			
一 For Mac(Mac OS X 10.5+) F1 显示注释文档F2 高亮错误或警告快速定位Command + F12 显示当前文件的结构(查看所有方法)Command + F 查找文本Comm ...
 - Objective-C 第一个小程序
			
示例一 (类似C) //1.代码编写 //跟C语言一样,OC程序的入口依然是main函数,只不过写到一个.m文件中.比如这里写到一个main.m文件中(文件名可以是中文) #include <s ...
 - Siki_Unity_1-3_Unity零基础入门_古迹探险
			
1-3 Unity零基础入门 古迹探险 任务1/2:资料下载 链接:https://pan.baidu.com/s/1jHVymNk 密码:rbob 任务3:工程的创建和打开 Project:古迹探险 ...
 - python中的迭代器与生成器
			
迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...
 - DP动态规划练习
			
先来看一下经典的背包问题吧 http://www.cnblogs.com/Kalix/p/7617856.html 01背包问题 https://www.cnblogs.com/Kalix/p/76 ...
 - LeetCode 96——不同的二叉搜索树
			
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...