题目链接

设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\)

\[f(x)g(x)\equiv 1\ (mod\ x^n)
\]

\[f(x)g(x)-1\equiv 0\ (mod\ x^n)
\]

\[f^2(x)g^2(x)-2f(x)g(x)+1\equiv 0\ (mod\ x^{2n})
\]

\[2f(x)g(x)-f^2(x)g^2(x)\equiv 1\ (mod\ x^{2n})
\]

\[2f(x)g(x)-f^2(x)g^2(x)\equiv f(x)g'(x)\ (mod\ x^{2n})
\]

\[g'(x)\equiv 2g(x)-f(x)g^2(x)\ (mod\ x^{2n})
\]

倍增就可以了。

对于len,lim的取值(< or <=)有点迷。。

(n是减1后的,且此时n=2^x) main()里的while(len<=n),如果是len<n,只是输出的n次系数为0这有问题,why?

还有个问题是,求两遍逆不是原多项式,比较神奇。。(不解)

//520ms	6.1MB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define P (998244353)
#define R (3)
#define inv_R (332748118)
#define Mult(a,b) (1ll*a*b%P)
//#define gc() getchar()
#define MAXIN 200000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
//#define Add(x,v) (x)+=(v),(x)>=P?(x)-=P:0
typedef long long LL;
const int N=(1<<18)+5; int n,F[N],G[N],A[N],B[N],rev[N],W[N];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1, x=Mult(x,x))
if(k&1) t=Mult(x,t);
return t;
}
void NTT(int *a,int type,int len)
{
int lim=1, L=0;
while(lim<len) lim<<=1, ++L;
for(int i=1; i<lim; ++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<L-1);
for(int i=1; i<lim; ++i) if(i<rev[i]) std::swap(a[i],a[rev[i]]);
for(int i=2; i<=lim; i<<=1)
{
int mid=i>>1, Wn=FP(~type?R:inv_R,(P-1)/i), t;
W[0]=1;
for(int j=1; j<mid; ++j) W[j]=Mult(W[j-1],Wn);
for(int j=0; j<lim; j+=i)
for(int k=0; k<mid; ++k)
a[j+k+mid]=(a[j+k]-(t=Mult(a[j+k+mid],W[k]))+P)%P,
a[j+k]=(a[j+k]+t)%P;
}
if(type==-1)
for(int i=0,inv=FP(lim,P-2); i<lim; ++i) a[i]=Mult(a[i],inv);
}
void Get_inv(int *f,int *g,int len)
{
if(len==1) {g[0]=FP(f[0],P-2); return;}
Get_inv(f,g,len>>1);
// memcpy(A,f,sizeof A), memcpy(B,g,sizeof B);//WA(除非加上下面一行):len~lim部分应为0,interesting~
// for(int i=len; i<N; ++i) A[i]=B[i]=0;
for(int i=0; i<len; ++i) A[i]=f[i], B[i]=g[i];
NTT(A,1,len<<1), NTT(B,1,len<<1);
for(int i=0; i<(len<<1); ++i) A[i]=Mult(A[i],Mult(B[i],B[i]));
NTT(A,-1,len<<1);
for(int i=0; i<len; ++i) g[i]=((g[i]<<1)%P-A[i]+P)%P;
} int main()
{
n=read()-1;
for(int i=0; i<=n; ++i) F[i]=read();
int len=1;
while(len<=n) len<<=1;//<?
Get_inv(F,G,len);
for(int i=0; i<=n; ++i) printf("%d ",G[i]);
return 0;
}

洛谷.4238.[模板]多项式求逆(NTT)的更多相关文章

  1. 【洛谷4238】 多项式求逆(NTT,分治)

    前言 多项式求逆还是爽的一批 Solution 考虑分治求解这个问题. 直接每一次NTT一下就好了. 代码实现 #include<stdio.h> #include<stdlib.h ...

  2. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

  3. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  4. 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...

  5. P4238 【模板】多项式求逆 ntt

    题意:求多项式的逆 题解:多项式最高次项叫度deg,假设我们对于多项式\(A(x)*B(x)\equiv 1\),已知A,求B 假设度为n-1,\(A(x)*B(x)\equiv 1(mod x^{\ ...

  6. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  7. luoguP4238 【模板】多项式求逆 NTT

    Code: #include <bits/stdc++.h> #define N 1000010 #define mod 998244353 #define setIO(s) freope ...

  8. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  9. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

随机推荐

  1. 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef

    新建项目启动报错的时候,一直报这个错,类找不到,郁闷了半天,都没百度到结果,后来发现是添加tomcat的时候jre没 指定..... 哈哈哈,太懵逼了,指定就ok了

  2. go 指针类型

    变量和内存地址 每个变量都有内存地址,可以说通过变量来操作对应大小的内存 var a int32 a = fmt.Printf(“%d\n”, a) fmt.Printf(“%p\n”, &a ...

  3. 音频增益响度分析 ReplayGain 附完整C代码示例【转】

    转自:http://www.cnblogs.com/cpuimage/p/8846951.html 人们所熟知的图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像 ...

  4. 吾修叫板微软,QMVC说比MVC5快!

    前段时间发一篇文章,是关于QMVC介绍的文章,有网友建议写篇关于测试结果的文章.毕竟QMVC是开源的,并且是倾向于性能级开发的,因为我实在不喜欢MVC5还采用跟web form一样的开发风格,不停的封 ...

  5. linux用户权限 -> 系统用户管理

    用户基本概述: Linux用户属于多用户操作系统,在windows中,可以创建多个用户,但不允许同一时间多个用户进行系统登陆,但是Linux可以同时支持多个用户同时登陆操作系统,登陆后互相之间并不影响 ...

  6. HTML5 之图片上传预处理

    在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 像我这么为用户着想的程序员,绝对不会让这种事情发生的, ...

  7. Ibatis.Net 各种配置说明学习(二)

    1.各个配置文件的配置说明 providers.config:指定数据库提供者,.Net版本等信息. xxxxx.xml:映射规则. SqlMap.config:大部分配置一般都在这里,如数据库连接等 ...

  8. 夜神模拟器调试android studio项目

    这几天为了android studio也是醉了,先是R文件丢失忙活一下午,各种百度谷歌,最后终于解决这个小问题,没想到在启动avd这个问题上更是棘手,网上的方法试了,主要有三种,上篇博文http:// ...

  9. 【笔记】Python简明教程

    Python简明教程,此资源位于http://woodpecker.org.cn/abyteofpython_cn/chinese/ s=u'中文字符' #u表示unicode,使用u之后能正常显示中 ...

  10. nginx学习 一.window下安装

    1. nginx下载路径 http://nginx.org/en/download.html 2.下载后解压到一个没有中文名的文件夹中 3.修改server下location的root为具体的路径,修 ...