$\newcommand{align}[1]{\begin{align*}#1\end{align*}}$题意:给出$f(x)=\prod\limits_{i=1}^n(a_ix+1)$和$g(x)=\prod\limits_{j=1}^m(b_jx+1)$的各项系数,求$h(x)=\prod\limits_{i=1}^n\prod\limits_{j=1}^m(a_ib_jx+1)$的前$k$项系数

乘积的形式不好处理,取个$\ln$就可以化为和的形式

$\align{\ln(a_ix+1)=\int\frac{a_i}{a_ix+1}\mathrm dx=\sum\limits_{k\geq1}\dfrac{(-1)^{k+1}}ka_i^kx^k}$

$\align{\ln(b_jx+1)=\sum\limits_{k\geq1}\dfrac{(-1)^{k+1}}kb_j^kx^k}$

$\align{\ln(a_ib_jx+1)=\sum\limits_{k\geq1}\dfrac{(-1)^{k+1}}ka_i^kb_j^kx^k}$

容易发现我们把前两个式子的系数做点积,再对$\forall k\geq1$把第$k$位乘上$(-1)^{-k+1}k$就得到了第三个式子的系数

所以我们把$\ln f(x)$和$\ln g(x)$的系数如此处理后就得到了$\ln h(x)$的系数,$\exp$回去即可

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=998244353,maxn=262144;
void swap(int&a,int&b){a^=b^=a^=b;}
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;}
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[maxn],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 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);
				a[j+k]=ad(a[j+k],t);
				w=mul(w,wn);
			}
		}
	}
	if(on==-1){
		for(i=0;i<N;i++)a[i]=mul(a[i],iN);
	}
}
int t0[maxn];
void getinv(int*a,int*b,int n){
	if(n==1){
		b[0]=pow(a[0],mod-2);
		return;
	}
	int i;
	getinv(a,b,n>>1);
	pre(n<<1);
	memset(t0,0,N<<2);
	memcpy(t0,a,n<<2);
	ntt(t0,1);
	ntt(b,1);
	for(i=0;i<N;i++)b[i]=mul(b[i],2-mul(b[i],t0[i]));
	ntt(b,-1);
	for(i=n;i<N;i++)b[i]=0;
}
int t1[maxn],inv[maxn];
void getln(int*a,int*b,int n){
	int i;
	memset(t1,0,n<<3);
	getinv(a,t1,n);
	for(i=1;i<n;i++)b[i-1]=mul(i,a[i]);
	ntt(b,1);
	ntt(t1,1);
	for(i=0;i<N;i++)b[i]=mul(b[i],t1[i]);
	ntt(b,-1);
	for(i=n-1;i>0;i--)b[i]=mul(b[i-1],inv[i]);
	b[0]=0;
	for(i=n;i<N;i++)b[i]=0;
}
int t2[maxn];
void exp(int*a,int*b,int n){
	if(n==1){
		b[0]=1;
		return;
	}
	int i;
	exp(a,b,n>>1);
	memset(t2,0,n<<3);
	getln(b,t2,n);
	for(i=0;i<n;i++)t2[i]=de(a[i],t2[i]);
	t2[0]++;
	ntt(b,1);
	ntt(t2,1);
	for(i=0;i<N;i++)b[i]=mul(b[i],t2[i]);
	ntt(b,-1);
	for(i=n;i<N;i++)b[i]=0;
}
int f[maxn],g[maxn],lf[maxn],lg[maxn],lh[maxn],h[maxn];
int main(){
	int N,n,m,k,i;
	scanf("%d%d%d",&n,&m,&k);
	for(i=0;i<=n;i++)scanf("%d",f+i);
	for(i=0;i<=m;i++)scanf("%d",g+i);
	for(N=1;N<n+1||N<m+1||N<k+1;N<<=1);
	inv[1]=1;
	for(i=2;i<N;i++)inv[i]=-mul(mod/i,inv[mod%i]);
	getln(f,lf,N);
	getln(g,lg,N);
	for(i=0;i<N;i++)lh[i]=mul(mul(lf[i],lg[i]),i&1?i:-i);
	exp(lh,h,N);
	for(i=0;i<k;i++)printf("%d ",ad(h[i],mod));
}

[xsy2978]Product of Roots的更多相关文章

  1. 【xsy2978】Product of Roots 生成函数+多项式ln+多项式exp

    题目大意:给你两个多项式$f(x)$和$g(x)$,满足$f(x)=\prod\limits_{i=1}^{n}(a_i+1)$,$g(x)=\prod\limits_{i=1}^{m}(b_i+1) ...

  2. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof

    A. City Wall 找规律. #include<stdio.h> #include<iostream> #include<string.h> #include ...

  3. gc roots 垃圾回收

    gc roots包括以下几个: 虚拟机栈(栈桢中的本地变量表)中的引用对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 本地方法栈中JNI(即native方法)的引用的对象 java,c ...

  4. uva 11059 maximum product(水题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB1QAAAMcCAIAAABo0QCJAAAgAElEQVR4nOydW7msuhKF2wIasIAHJK

  5. [LeetCode] Product of Array Except Self 除本身之外的数组之积

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  6. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. vector - vector product

    the inner product Givens two vectors \(x,y\in \mathbb{R}^n\), the quantity \(x^\top y\), sometimes c ...

  8. 1 Maximum Product Subarray_Leetcode

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. Leetcode Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

随机推荐

  1. MySQL使用笔记(七)排序和限制数据记录查询

    By francis_hao    Dec 17,2016 排序数据记录查询 排序是指将筛选出符合条件的数据进行有序排放,有升序(ASC(默认))方式和降序(DESC)方式. mysql> se ...

  2. How to disable index in innodb

    Q: I read from many places that disabling index before loading a data table can significantly speed ...

  3. HDU 4417 划分树写法

    Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...

  4. 对Office文档进行授权

    Microsoft.Office.Interop.Word.ApplicationClass app = new Microsoft.Office.Interop.Word.ApplicationCl ...

  5. js实现页面触摸滑动

    先设置一个div  高度不能设置100% . window.addEventListener("load",function(){ var addEventListener = ' ...

  6. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  7. php模式-数据映射模式

    概念:简言之,数据映射模式就是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 深入理解:数据映射,是在持久化数据存储层(一般是关系型数据库)和驻于内存的数据表现层之间进行双向数据 ...

  8. @RequestBody和@RequestParam、@ResponseBody的使用

    一:前沿 针对spring mvc的使用,其实我不怎么熟悉的,因为我只是会用几个常用的注解,其他高深的我都不是很清楚的,而且每次用有时候还需要出查资料的,现在自己记载下吧. 二:内容 (1)这里的@R ...

  9. NYOJ 349 Sorting It All Out (拓扑排序 )

    题目链接 描述 An ascending sorted sequence of distinct values is one in which some form of a less-than ope ...

  10. hdu 1509 Windows Message Queue (优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1509 题目大意:每一次输入都有序号和优先级,优先级小的先输出,优先级相同的话则序号小的先输出!第一次用 ...