博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4238 【模板】多项式求逆 ntt
阅读量:4613 次
发布时间:2019-06-09

本文共 2326 字,大约阅读时间需要 7 分钟。

题意:求多项式的逆

题解:多项式最高次项叫度deg,假设我们对于多项式\(A(x)*B(x)\equiv 1\),已知A,求B
假设度为n-1,\(A(x)*B(x)\equiv 1(mod x^{\lceil \frac{n}{2} \rceil})\),\(A(x)*B'(x)\equiv 1(mod x^{\lceil \frac{n}{2} \rceil})\)
两式相减得\(B(x)-B'(x)\equiv 0(mod x^{\lceil \frac{n}{2} \rceil})\),平方得\(B(x)^2-2*B(x)*B'(x)+B'(x)^2\equiv 0(mod x^n)\)
注意到mod数也平方了,这是因为如果\(A(x)\equiv 0(modx^n)\),就说明A的0-n-1项都是0,对于n到2*n-1项第x项来说有\(\sum_{i=1}^x A(i)*A(x-i)\),一定有一项小于n,则必为0
对于上式,两边同乘A(x),则有\(B(x)=2*B'(x)-A(x)*B'(x)\)
可以递推解决

//#pragma GCC optimize(2)//#pragma GCC optimize(3)//#pragma GCC optimize(4)//#pragma GCC optimize("unroll-loops")//#pragma comment(linker, "/stack:200000000")//#pragma GCC optimize("Ofast,no-stack-protector")//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#include
#define fi first#define se second#define db double#define mp make_pair#define pb push_back#define pi acos(-1.0)#define ll long long#define vi vector
#define mod 998244353#define ld long double#define C 0.5772156649#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1#define pll pair
#define pil pair
#define pli pair
#define pii pair
//#define cd complex
#define ull unsigned long long#define base 1000000000000000000#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define fin freopen("a.txt","r",stdin)#define fout freopen("a.txt","w",stdout)#define fio ios::sync_with_stdio(false);cin.tie(0)template
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}template
inline T const& MIN(T const &a,T const &b){return a
=mod)a-=mod;}inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}using namespace std;const double eps=1e-8;const ll INF=0x3f3f3f3f3f3f3f3f;const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f;ll a[N<<3],b[N<<3],c[N<<3];int rev[N<<3];void getrev(int bit){ for(int i=0;i<(1<
>1]>>1) | ((i&1)<<(bit-1));}void ntt(ll *a,int n,int dft){ for(int i=0;i
>1,a,b); int sz=0;while((1<
<=deg)sz++;sz++; getrev(sz);int len=1<

转载于:https://www.cnblogs.com/acjiumeng/p/9525106.html

你可能感兴趣的文章
linux使用rz、sz快速上传、下载文件
查看>>
判断数字的正则表达式
查看>>
DOC常用命令(转)
查看>>
php写一个判断是否有cookie的脚本
查看>>
Mac配置Fiddler抓包工具
查看>>
转:Java并发集合
查看>>
Word截图PNG,并压缩图片大小
查看>>
Python项目对接CAS方案
查看>>
mysql产生随机数
查看>>
编程风格
查看>>
熟悉常用的Linux命令
查看>>
易之 - 我是个大师(2014年3月6日)
查看>>
Delphi中窗体的事件
查看>>
file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did
查看>>
linux vi编辑器
查看>>
js树形结构-----(BST)二叉树增删查
查看>>
contract
查看>>
FJUT ACM 1899 Largest Rectangle in a Histogram
查看>>
如何删除xcode项目中不再使用的图片资源
查看>>
编写用例文档
查看>>