多项式 ln
多项式 ln
定义
\(给一多项式F(x),求G(x)\equiv lnF(x)\pmod x^n\)
前置知识
- \(不定积分\)
- \(微分\)
- \(多项式乘法逆\)
推式子:
\]
\]
\]
\]
步骤:
\(1.求F(x)的导数\)
\(2.求F(x)的逆F_r(x)\)
\(3.求\int F(x)F_r(x)dx\)
\]
\]
\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
# define read read1<int>()
# define Type template<typename T>
Type inline T read1(){
T n=0;
char k;
bool fl=0;
do (k=getchar())=='-'&&(fl=1);while('9'<k||k<'0');
while(47<k&&k<58)n=(n<<3)+(n<<1)+(k^48),k=getchar();
return fl?-n:n;
}
# define f(i,l,r) for(int i=(l);i<=(r);++i)
# define fre(k) freopen(k".in","r",stdin);freopen(k".ans","w",stdout)
# define ll int64_t
class Array{
private:
vector<int>a;
public:
Array(const int size,const int f):a(size,f){}
void push(int n){a.push_back(n);}
Array(int* l=NULL,int* r=NULL){while(l!=r)push(*l),++l;}
inline int size(){return a.size();}
inline int& operator [] (const int x){return a[x];}
void resize(int n){a.resize(n);}
void clear(){a.clear();}
void swap(){reverse(a.begin(),a.end());}
int& top(){return a[a.size()-1];}
void pop(){a.pop_back();}
};
const int mod=998244353,g=3,inv2=499122177;
Array operator -(Array a,Array b){
int N=a.size(),M=b.size();
Array t;
for(int i=0;i<N&&i<M;++i){
t.push((i<N?a[i]:0)-(i<M?b[i]:0));
if(t.top()<0)t.top()+=mod;
}
return t;
}
Array operator +(Array a,Array b){
int N=a.size(),M=b.size();
Array t;
for(int i=0;i<N&&i<M;++i){
t.push((i<N?a[i]:0)+(i<M?b[i]:0));
if(t.top()>=mod)t.top()-=mod;
}
return t;
}
Array operator *(Array a,int n){
int N=a.size();
for(int i=0;i<N;a[i]=(ll)a[i]*n%mod,++i);
return a;
}
Array operator *(int n,Array a){return a*n;}
int qkpow(int b,int m,int mod){
int tem=b,ans=1;
for(;m;m>>=1,tem=(ll)tem*tem%mod)
if(m&1)ans=(ll)ans*tem%mod;
return ans;
}
int* NTT(const int len,Array& a,const bool Ty,int* r=NULL){
if(!r){
r=new int[len];
r[0]=0;int L=log2(len);
f(i,0,len-1)
r[i]=(r[i>>1]>>1)|((i&1)<<L-1);
}
f(i,0,len-1)
if(i<r[i])swap(a[i],a[r[i]]);
for(int i=1;i<len;i<<=1){
int T=qkpow(Ty?g:332748118,(mod-1)/(i<<1),mod);
for(int W=i<<1,j=0;j<len;j+=W){
ll omega=1;
for(int k=0;k<i;++k,omega=omega*T%mod){
ll x(a[j+k]),y(omega*a[i+j+k]%mod);
a[j+k]=x+y;(a[j+k]>mod)&&(a[j+k]-=mod);
a[i+j+k]=x-y+mod;(a[i+j+k]>mod)&&(a[i+j+k]-=mod);
}
}
}
return r;
}
Array operator * (Array x,Array y){
int n=x.size()-1,m=y.size()-1;
int limit=1;
while(limit<=n+m)limit<<=1;
Array ans;
x.resize(limit+1);
y.resize(limit+1);
int *r;
r=NTT(limit,x,1);
NTT(limit,y,1,r);
f(i,0,limit)x[i]=(ll)x[i]*y[i]%mod;
NTT(limit,x,0,r);
int tem=qkpow(limit,mod-2,mod);
f(i,0,n+m)ans.push((ll)x[i]*tem%mod);
return ans;
}
Array& operator *= (Array& x,Array y){
return x=x*y;
}
void Rev(Array &x,Array y){
int n=x.size()-1,m=y.size()-1;
int limit=1;
while(limit<=n+m)limit<<=1;
Array ans;
x.resize(limit+1);
y.resize(limit+1);
int *r;
r=NTT(limit,x,1);
NTT(limit,y,1,r);
f(i,0,limit)x[i]=(ll)(2ll-(ll)x[i]*y[i]%mod+mod)%mod*y[i]%mod;
NTT(limit,x,0,r);
int tem=qkpow(limit,mod-2,mod);
f(i,0,n+m)x[i]=(ll)x[i]*tem%mod;
x.resize(n+m+1);
}
Array Inv(Array a){
int N=a.size();
// printf("%d\n",N);
if(N==1)return Array(1,qkpow(a[0],mod-2,mod));
Array b=a;b.resize(N+1>>1);
b=Inv(b);b.resize(N);
Rev(a,b);
a.resize(N);
return a;
}
Array operator / (Array x,Array y){
int N=x.size()-1,M=y.size()-1;
if(N<M)return Array(1,0);
x.swap();y.swap();
y.resize(N-M+1);
x*=Inv(y);
x.resize(N-M+1);
x.swap();
return x;
}
Array sqrt(Array x){
int N=x.size();
if(N==1)return Array(1,1);
Array y=x;
y.resize(N+1>>1);
y=sqrt(y);
y.resize(N);
Array z=Inv(y);
return inv2*(y+x*z);
}
Array diff(Array x){
for(int i=0;i+1<x.size();++i)
x[i]=(ll)x[i+1]*(i+1)%mod;
x.pop();
return x;
}
Array integral(Array x){
for(int i=x.size();--i;)
x[i]=(ll)x[i-1]*qkpow(i,mod-2,mod)%mod;
x[0]=0;
return x;
}
Array ln(Array x){
int N=x.size();
x=integral(diff(x)*Inv(x));
x.resize(N);
return x;
}
int n;
Array x;
int main(){
n=read;
for(int i=0;i<n;++i)x.push(read);
x=ln(x);
for(int i=0;i<n;++i)printf("%d ",x[i]);
return 0;
}
多项式 ln的更多相关文章
- 【XSY2730】Ball 多项式exp 多项式ln 多项式开根 常系数线性递推 DP
题目大意 一行有\(n\)个球,现在将这些球分成\(k\) 组,每组可以有一个球或相邻两个球.一个球只能在至多一个组中(可以不在任何组中).求对于\(1\leq k\leq m\)的所有\(k\)分别 ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
- 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 ...
- P6295-有标号 DAG 计数【多项式求逆,多项式ln】
正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...
- 【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) ...
- 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- ...
- 洛谷P4725 【模板】多项式对数函数(多项式ln)
题意 题目链接 Sol 这个不用背XD 前置知识: \(f(x) = ln(x), f'(x) = \frac{1}{x}\) \(f(g(x)) = f'(g(x)) g'(x)\) 我们要求的是\ ...
- luogu 4725 【模板】多项式对数函数(多项式 ln)
$G(x)=ln(A(x))$ $G'(x)=ln'(A(x))A'(x)=\frac{A'(x)}{A(x)}$ 由于求导和积分是互逆的,所以对 $G$ 求积分,即 $G(x)=\int\f ...
随机推荐
- Docker(Linux)学习笔记以及Redis/MariaDB的容器使用后台全自动启动
1:Docker安装,由于Docker后续pull镜像的服务器默认是在国外的,速度实在是太慢,这里使用阿里云的镜像 阿里云的Docker CE 镜像源站进行安装 docker ===========U ...
- WPF MVVM框架(5)
前面几章节所讲到的内容, 基本上属于前端XAML的使用方法, 那么本章及后面的章节, 则会侧重于UI与业务分离如何分离 . UI与业务逻辑之间的互操作性,, 下面将介绍WPF中, 比较主流的MVVM框 ...
- Python破解js加密实例(有道在线翻译)
在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签名验证,对传输数据进行加密处理 对于js加密经过加密传输的就是 ...
- Java开发设计——七大原则
Java开发设计——七大原则 摘要:本文主要介绍了在做面向对象开发时要注意的七个原则. 部分内容来自以下博客: https://www.cnblogs.com/xiyuekamisama/p/1057 ...
- 在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
在centos7中安装好docker以后,启动成功,运行命令 docker info ,报错: [root@iz2ze2bn5x2wqxdeq65wlpz ~]# docker info Client ...
- Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266或DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()
使用QMediaPlayer和QVideoWidget QHBoxLayout *m_layout=newQHBoxLayout(this); QMediaPlayer *m_player = new ...
- 前端页面 title keyword description的添加
用法:<title>网站标题</title> 用法:<meta name=”Keywords” Content=”关键词1,关键词2,关键词3,关键词4″> 用法: ...
- iOS中Category和Extension 原理详解
(一)Category .什么是Category? category是Objective-C .0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已 ...
- 电信NBIOT 5 - NB73模块下行测试(自己平台-电线平台-NB73)
电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...
- HBuilder 云打包生成 .apk 文件所需的安卓证书如何获取以及文件打包前必须的设置
在 HBuilder 云打包功能中,生在 .apk 文件虽然平台提供了免费的 安卓证书,但如果有其它需求,比如想发布,那么就需要自己去申请各种类型的证书了,这里介绍几个工具,方便在线生成证书并配置到打 ...