【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)$。
现在给你一个多项式$h(x)$,满足$h(x)=\prod\limits_{i=1}^{n}\prod\limits_{j=1}^{m}(a_ib_j+1)$
请输出多项式$h$的前$k$项,在模$998244353$意义下进行。
数据范围:$n,m≤10^5$。
我们现在有:
$f(x)=\prod\limits_{i=1}^{n}(a_i+1)$
我们在等式两边都取对数,然后泰勒展开,得到:
$\begin{align} ln \big(f(x)\big) =&\sum\limits_{i=1}^{n} ln(a_i+1) \\=&\sum\limits_{i=1}^{n} \sum_{k=1}^{\infty} \frac{(-1)^{k+1}}{k}x^ka_i^{k}\end{align}$
我们不难推出:
$[x^k]ln(f(x))=\sum\limits_{i=1}^{n} \frac{(-1)^{k+1}}{k}a_i^{k}$
$g(x)$同理。
我们现在来考虑$h(x)$,我们现在有:
$h(x)=\prod\limits_{i=1}^{n}\prod\limits_{j=1}^{m}(a_ib_j+1)$
和上面一样,我们在等式两边都取对数,然后泰勒展开,得到:
$\begin{align}
ln\big(h(x)\big) =&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ln(a_ib_j+1)\\
=&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum_{k=1}^{\infty} \frac{(-1)^{k+1}}{k}x^ka_i^{k}b_j^{k}\\
=&\sum\limits_{k=1}^{\infty}x^k \sum\limits_{i=1}^{n} \frac{(-1)^{k+1}}{k}a_i^{k}\sum\limits_{i=1}^{m} b_i^{k}\\
=&\sum\limits_{k=1}^{\infty}\frac{k}{(-1)^{k+1}}x^k \sum\limits_{i=1}^{n} \frac{(-1)^{k+1}}{k}a_i^{k}\sum\limits_{i=1}^{m} \frac{(-1)^{k+1}}{k}b_i^{k}\\
\end{align}$
我们不难推出:
$\begin{align}[x^k]ln(h(x))=&\frac{k}{(-1)^{k+1}} \sum\limits_{i=1}^{n} \frac{(-1)^{k+1}}{k}a_i^{k}\sum\limits_{i=1}^{m} \frac{(-1)^{k+1}}{k}b_i^{k}\\
=&\frac{k}{(-1)^{k+1}}[x^k]ln\big(f(x)\big)[x^k]ln\big(g(x)\big)
\end{align}$
我们可以考虑,用多项式求$ln$,求出$ln\big(f(x)\big)$和$ln\big(g(x)\big)$,然后求出$ln(h(x))$后再用多项式$exp$算回去,就得到多项式$h$了。
套一个多项式的板子就可以了。
完结撒花
#include<bits/stdc++.h>
#define M (1<<19)
#define L long long
#define MOD 998244353
#define G 3
using namespace std; L pow_mod(L x,L k){
L ans=;
while(k){
if(k&) ans=ans*x%MOD;
x=x*x%MOD; k>>=;
}
return ans;
} void change(L a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
void NTT(L a[],int n,int on){
change(a,n);
for(int h=;h<=n;h<<=){
L wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
L w=;
for(int k=j;k<j+(h>>);k++){
L u=a[k],t=w*a[k+(h>>)]%MOD;
a[k]=(u+t)%MOD;
a[k+(h>>)]=(u-t+MOD)%MOD;
w=w*wn%MOD;
}
}
}
if(on==-){
L inv=pow_mod(n,MOD-);
for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
reverse(a+,a+n);
}
} void getinv(L a[],L b[],int n){
if(n==){b[]=pow_mod(a[],MOD-); return;}
static L c[M],d[M];
memset(c,,n<<); memset(d,,n<<);
getinv(a,c,n>>);
for(int i=;i<n;i++) d[i]=a[i];
NTT(d,n<<,); NTT(c,n<<,);
for(int i=;i<(n<<);i++) b[i]=(*c[i]-d[i]*c[i]%MOD*c[i]%MOD+MOD)%MOD;
NTT(b,n<<,-);
for(int i=;i<n;i++) b[n+i]=;
} void qiudao(L a[],L b[],int n){
memset(b,,sizeof(b));
for(int i=;i<n;i++) b[i-]=i*a[i]%MOD;
}
void jifen(L a[],L b[],int n){
memset(b,,sizeof(b));
for(int i=;i<n;i++) b[i+]=a[i]*pow_mod(i+,MOD-)%MOD;
} void getln(L a[],L b[],int n){
static L c[M],d[M];
memset(c,,n<<); memset(d,,n<<);
qiudao(a,c,n); getinv(a,d,n);
NTT(c,n<<,); NTT(d,n<<,);
for(int i=;i<(n<<);i++) c[i]=c[i]*d[i]%MOD;
NTT(c,n<<,-);
jifen(c,b,n);
} void getexp(L a[],L b[],int n){
if(n==){b[]=; return;}
static L lnb[M]; memset(lnb,,n<<);
getexp(a,b,n>>); getln(b,lnb,n);
for(int i=;i<n;i++) lnb[i]=(a[i]-lnb[i]+MOD)%MOD,b[i+n]=;
lnb[n]=;
lnb[]=(lnb[]+)%MOD;
NTT(lnb,n<<,); NTT(b,n<<,);
for(int i=;i<(n<<);i++) b[i]=b[i]*lnb[i]%MOD;
NTT(b,n<<,-);
for(int i=;i<n;i++) b[i+n]=;
} int n,m,k,len;
L f[M]={},g[M]={},h[M]={},lf[M]={},lg[M]={},lh[M]={}; int main(){
scanf("%d%d%d",&n,&m,&k);
for(len=;len<=(n+m+);len<<=);
for(int i=;i<=n;i++) scanf("%lld",f+i);
for(int i=;i<=m;i++) scanf("%lld",g+i);
getln(f,lf,len);
getln(g,lg,len);
for(int i=;i<len;i++) lh[i]=(lf[i]*lg[i]%MOD*(i&?i:-i)%MOD+MOD)%MOD;
getexp(lh,h,len);
for(int i=;i<k;i++) printf("%lld ",h[i]);
}
【xsy2978】Product of Roots 生成函数+多项式ln+多项式exp的更多相关文章
- 【XSY2730】Ball 多项式exp 多项式ln 多项式开根 常系数线性递推 DP
题目大意 一行有\(n\)个球,现在将这些球分成\(k\) 组,每组可以有一个球或相邻两个球.一个球只能在至多一个组中(可以不在任何组中).求对于\(1\leq k\leq m\)的所有\(k\)分别 ...
- CF838C(博弈+FWT子集卷积+多项式ln、exp)
传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...
- 洛谷P5245 【模板】多项式快速幂(多项式ln 多项式exp)
题意 题目链接 Sol \(B(x) = \exp(K\ln(A(x)))\) 做完了... 复杂度\(O(n\log n)\) // luogu-judger-enable-o2 // luogu- ...
- [xsy2978]Product of Roots
$\newcommand{align}[1]{\begin{align*}#1\end{align*}}$题意:给出$f(x)=\prod\limits_{i=1}^n(a_ix+1)$和$g(x)= ...
- 多项式求ln,求exp,开方,快速幂 学习总结
按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
- P6295-有标号 DAG 计数【多项式求逆,多项式ln】
正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...
- 多项式 ln
多项式 ln 定义 \(给一多项式F(x),求G(x)\equiv lnF(x)\pmod x^n\) 前置知识 \(不定积分\) \(微分\) \(多项式乘法逆\) 推式子: \[\because ...
- luogu P4725 多项式对数函数(多项式 ln)
LINK:多项式对数函数 多项式 ln 如题 是一个模板题.刚学会导数 几个知识点 \([f(x)\cdot g(x)]'=f(x)'g(x)+f(x)g(x)',f(g(x))'=f'(g(x))g ...
随机推荐
- stl 自定义排序与删除重复元素
转: STL—vector删除重复元素 STL提供了很多实用的算法,这里主要讲解sort和unique算法. 删除重复元素,首先将vector排序. sort( vecSrc.begin(), vec ...
- Djang简单使用
用户访问内容 用户能够访问的所有的资源,都是程序猿提前暴露的,如果没有暴露,用户是不能进行访问的. diango重启的问题 当我们更改django中的代码的时候,django内部会检测到我们更 ...
- 024 Android 自定义样式对话框(AlertDialog)
1.AlertDialog介绍 AlertDialog并不需要到布局文件中创建,而是在代码中通过构造器(AlertDialog.Builder)来构造标题.图标和按钮等内容的. 常规使用步骤(具体参见 ...
- Quartz.Net—初识
什么是Quartz.Net 计划任务,定时框架.大到可以做灾难转移 负载均衡.小到可以做定时生成数据,数据更新等等. 官网 http://www.quartz-scheduler.org/ Q ...
- xsy 2414【CF587C】Duff in the Army
Description [题目描述]: 最近有一场战争发生,Duff是战争里一名士兵,Malek是她的长官. 他们的国家——Andarz Gu有n个城市(编号为1到n),总共有n-1条道路,每条道路连 ...
- 准备写个Golang开发的教程
进入golang的开发已经差不多两年了,最近打算写个Golang的教程.目的是让有开发基础,没接触过Golang的人能够愉快高效地写出Golang项目. 1 记得17年底时候,有个特别小的项目,准备试 ...
- linux 磁盘占用的排查流程
Linux 服务器在使用过程中可能会遇到各种问题,其中之一就是"没有可用空间". 遇到这种情况,就需要进行排查,定位到消耗了磁盘的那个文件夹. 流程如下: 1. df -h df ...
- (转)DMA(Direct Memory Access)
DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...
- java 读取文件流
搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...
- 在论坛中出现的比较难的sql问题:35(时间间隔计算问题)
原文:在论坛中出现的比较难的sql问题:35(时间间隔计算问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.