洛谷P4238 【模板】多項式求逆(NTT)

傳送門

?

學習了一下大佬的->這里

已知多項式$A(x)$,若存在$A(x)B(x)\equiv 1\pmod{x^n}$

則稱$B(x)$為$A(x)$在模$x^n$下的逆元,記做$A^{-1}(x)$

具體的來說的話,就是兩個多項式$A,B$相乘模$x^n$之后,所有次數大于等于$n$的項都沒了,那么只有在剩下的項相乘之后未知數項全被消掉只留下一個常數項$1$時,$B$才是$A$的逆元

然后為什么要有模$x^n$的限制呢?因為沒有這個限制的話,$B$可能有無窮多項

然后我們考慮如何計算$B(x)$

當$n=1$的時候,$A(x)\equiv c\pmod{x}$,其中$c$為常數項,那么$A^{-1}(x)$就是$c^{-1}$

當$n>1$時$$B(x)A(x)\equiv 1\pmod{x^n}$$

設$B'(x)$是模$x^{\left\lceil\frac{n}{2}\right\rceil}$時的逆元,即$$B'(x)A(x)\equiv 1\pmod{x^{\left\lceil\frac{n}{2}\right\rceil}}$$

首先,可以肯定$$B(x)A(x)\equiv 1\pmod{x^{\left\lceil\frac{n}{2}\right\rceil}}$$

那么上下兩個式子相減可得$$B(x)-B'(x)\equiv 0\pmod{{x^{\left\lceil\frac{n}{2}\right\rceil}}}$$

然后兩邊平方$$B^2(x)-2B'(x)B(x)+B'^2(x)\equiv 0\pmod{{x^n}}$$

為什么上面模數變成$x^n$呢?我們考慮如果一個多項式在$\pmod{x^n}$的情況下為$0$,那么說明$0$到$n-1$項的系數也為$0$,它平方之后$0$到$2n-1$項系數$a_i$為$\sum_{j=0}^ia_ja_{i-j}$,那么$j$和$i-j$中必有一個小于$n$,也就是說$a_j$和$a_{i-j}$里必有一個為$0$,那么$a_i$也是$0$,所以平方之后在$\mod{2n}$也為$0$

然后在上式兩邊同乘$A(x)$并移項可得$$B(x)\equiv2B'(x)-A(x)B'^2(x)\pmod{x^n}$$

那么發現這個東西可以遞歸計算,時間復雜度為$O(nlogn)$

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define swap(x,y) (x^=y,y^=x,x^=y)
 6 #define mul(x,y) (1ll*x*y%P)
 7 #define add(x,y) (x+y>=P?x+y-P:x+y)
 8 #define dec(x,y) (x-y<0?x-y+P:x-y)
 9 using namespace std;
10 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
11 char buf[1<<21],*p1=buf,*p2=buf;
12 inline int read(){
13     #define num ch-'0'
14     char ch;bool flag=0;int res;
15     while(!isdigit(ch=getc()))
16     (ch=='-')&&(flag=true);
17     for(res=num;isdigit(ch=getc());res=res*10+num);
18     (flag)&&(res=-res);
19     #undef num
20     return res;
21 }
22 char sr[1<<21],z[20];int C=-1,Z;
23 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
24 inline void print(int x){
25     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
26     while(z[++Z]=x%10+48,x/=10);
27     while(sr[++C]=z[Z],--Z);sr[++C]=' ';
28 }
29 const int N=(1<<21)+5,P=998244353,G=3,Gi=332748118;
30 inline int ksm(int a,int b){
31     int res=1;
32     while(b){
33         if(b&1) res=mul(res,a);
34         a=mul(a,a),b>>=1;
35     }
36     return res;
37 }
38 int n,r[N],X[N],Y[N],A[N],B[N],O[N];
39 void NTT(int *A,int type,int len){
40     int limit=1,l=0;
41     while(limit<len) limit<<=1,++l;
42     for(int i=0;i<limit;++i)
43     r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
44     for(int i=0;i<limit;++i)
45     if(i<r[i]) swap(A[i],A[r[i]]);
46     for(int mid=1;mid<limit;mid<<=1){
47         int R=mid<<1,Wn=ksm(G,(P-1)/R);O[0]=1;
48         for(int j=1;j<mid;++j) O[j]=mul(O[j-1],Wn);
49         for(int j=0;j<limit;j+=R){
50             for(int k=0;k<mid;++k){
51                 int x=A[j+k],y=mul(O[k],A[j+k+mid]);
52                 A[j+k]=add(x,y),A[j+k+mid]=dec(x,y);
53             }
54         }
55     }
56     if(type==-1){
57         //這里這么寫是因為如果要點值轉系數直接reverse再除以n(也就是乘個逆元)就好了 
58         reverse(A+1,A+limit);
59         for(int i=0,inv=ksm(limit,P-2);i<limit;++i)
60         A[i]=mul(A[i],inv);
61     }
62 }
63 void work(int *a,int *b,int len){
64     if(len==1) return (void)(b[0]=ksm(a[0],P-2));
65     work(a,b,len>>1);
66     for(int i=0;i<len;++i) A[i]=a[i],B[i]=b[i];
67     NTT(A,1,len<<1),NTT(B,1,len<<1);
68     for(int i=0;i<(len<<1);++i)
69     A[i]=mul(mul(A[i],B[i]),B[i]);
70     NTT(A,-1,len<<1);
71     for(int i=0;i<len;++i) b[i]=(1ll*(b[i]<<1)%P+P-A[i])%P;
72 }
73 int main(){
74 //    freopen("testdata.in","r",stdin);
75     n=read();
76     for(int i=0;i<n;++i) X[i]=(read()+P)%P;
77     int len;for(len=1;len<n;len<<=1);
78     work(X,Y,len);
79     for(int i=0;i<n;++i) print(Y[i]);
80     Ot();
81     return 0;
82 }

?

轉載于:https://www.cnblogs.com/bztMinamoto/p/9743310.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10安裝TortoiseGit

TortoiseGit 是Git的可視化工具。所以前提是已經安裝了Git&#xff0c;安裝很簡單一路next。 下載地址&#xff0c;百度搜“TortoiseGit”&#xff0c;一般是第一個。 目前地址是&#xff1a;https://tortoisegit.org/download/ 如果打不開&#xff0c;可以進入騰訊軟件中心…

CF1045G AI robots(動態開點線段樹)

題意 火星上有$N$個機器人排成一行&#xff0c;第$i$個機器人的位置為$x_{i}$&#xff0c;視野為$r_{i}$&#xff0c;智商為$q_{i}$。我們認為第$i$個機器人可以看到的位置是$[x_{i}-r_{i},x_{i}r_{i}]$。如果一對機器人相互可以看到&#xff0c;且它們的智商$q_{i}$的差距不大…

android qq登錄 獲取用戶信息嗎,免登錄 只需要一個QQ號就能獲取QQ頭像和QQ昵稱 獲取QQ用戶信息API...

[PHP] 純文本查看 復制代碼<?php // headerheader("Content-Type:application/json");error_reporting(E_ALL^E_NOTICE^E_WARNING);// 獲取QQ號$qq $_GET["qq"];// 過濾if (trim(empty($qq))) {echo json_encode(array(status > error,msg > 未…

Python3.8安裝 jupyter報錯 NotImplementedError

報錯如下&#xff1a; 原因&#xff1a; 是由于 python3.8 asyncio 在 windows 上默認使用 ProactorEventLoop 造成的&#xff0c;而不是之前的 SelectorEventLoop。jupyter 依賴 tornado&#xff0c;而 tornado 在 window 上需要使用 SelectorEventLoop&#xff0c;所以產生這…

淺析Nginx 正向代理與反向代理

1、正向代理和反向代理的概念 無論是正向代理&#xff0c;還是反向代理&#xff0c;說到底&#xff0c;就是代理模式的衍生版本罷了。我們都學習過代理設計模式&#xff0c;都知道代理模式中有代理角色和被代理角色&#xff0c;為什么這么說&#xff0c;因為這兩個角色對于我們…

pycharm 安裝 jupyter

jupyter可以像筆記一樣&#xff0c;在學習和整理思路時很好。 使用的python是3.7.5版本 windows安裝步驟&#xff1a; cmd 再修改下pip的源&#xff0c;選擇國內&#xff0c;這樣快。 國內pip源: 阿里云 https://mirrors.aliyun.com/pypi/simple/ 廣東 豆瓣https://pypi…

android5.1 sdk version,java - Android SDK version 23.6 - Stack Overflow

Does it support java 8 yet?Eclipse is displaying this as a problem, surely it does support 8 by now? In the release notes for revision 23.6 it says java 7 or higher, does this mean java 8 is included or? Wish theyd be more specific about such details. A…

或成為性能寵兒,榮耀8x Max 驍龍660版首銷在即

今天已經是十一假期的最后一天了&#xff0c;假期馬上就要結束了&#xff0c;雖然這有點讓人遺憾&#xff0c;但是接下來的好消息讓很多人的心情好了不少&#xff0c;那就是10月8日榮耀8x Max驍龍660版本就要在全平臺開售了&#xff0c;這恐怕是節后最開心的事情了。此前&#…

績效考核編寫說明

第一步&#xff1a; 請大家從群文件下載自己的考核表&#xff0c;該表格是季度初填寫的&#xff0c;與實際進度安排有偏差&#xff0c;需要調整&#xff08;見第三步&#xff09; 第二步&#xff1a; 請大家從群文件下載部門考核表&#xff0c;如第四季度該文件名“【預評分】…

android 雙線程等待,在Java/Android中啟動另一個線程之前如何等待線程完成?

在回答您的問題之前&#xff0c;我強烈建議您查看ExecutorServices&#xff0c;例如ThreadPoolExecutor。現在回答你的問題&#xff1a;如果要等待上一個線程完成&#xff0c;在開始下一步之前&#xff0c;您可以在之間添加thread.join()&#xff1a;for(int i 0; i < 10; …

讀書筆記-說服力 讓你的PPT會說話

說服力&#xff1a;讓你的PPT會說話張志 包翔 劉俊前言優秀的幻燈片是內容和形式的完美統一&#xff0c;掌握配色排版特效的技術也很重要&#xff0c;不過對大部分人&#xff0c;這些基礎操作都已經初步掌握了。要進一步提高&#xff0c;技術不是制作高水平PPT的主要障礙&#…

無法訪問com.sun.beans.introspect.PropertyInfo

idea在install或者package項目的時候報錯&#xff1a;無法訪問com.sun.beans.introspect.PropertyInfo 原因是&#xff1a;idea編譯該項目的jdk不是1.8 修復方法&#xff1a; idea---file---project structure 把本地安裝的jdk1.8配置上 再運行問題解決

idea lombok 插件安裝

下載了guns源代碼&#xff0c;idea提示很多方法不存在。后來發現是沒有安裝 lombok 插件。 lombok讓java代碼更加簡潔&#xff0c;具體介紹&#xff1a;https://www.cnblogs.com/heyonggang/p/8638374.html 安裝&#xff1a; File---setting---plugins

怎么把pdf轉換為html,如何將PDF轉換成HTML網頁格式呢?

原標題&#xff1a;如何將PDF轉換成HTML網頁格式呢&#xff1f;現在很多在校程序學生們時常在思考怎么對HTML網頁進行編譯以呈現出想要展現的內容。但是HTML猶如我們外語學習一樣&#xff0c;一個網頁有很多的HTML文件&#xff0c;超文本標記語言文件以.htm(磁盤操作系統DOS限制…

Epson C1100報錯“Service Req E511”的處理方法

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/renyuansoft/blog/2231623

guns企業高級單體版(前后端不分離)運行啟動

單體版分前后端分離與不分離&#xff0c;這里分享前后端不分離的搭建方法 訪問guns官網https://www.stylefeng.cn&#xff0c;登錄后可查看教程&#xff08;賬號密碼見群公告&#xff09; 官方教程不是最新的&#xff0c;有些地方寫的不是很清楚 第一步 確認環境 JDK1.8 M…

華為手機應用鴻蒙os,華為手機內置應用逐漸向鴻蒙 OS 靠攏

IT 之家 3 月 21 日消息 華為在去年 12 月 16 日舉行 HarmonyOS 2.0 手機開發者 Beta 活動。現場正式發布了 HarmonyOS 2.0 手機開發者 Beta 版本。同時&#xff0c;HarmonyOS 2.0 手機開發者 Beta 開啟公測。華為表示&#xff0c;HarmonyOS 是面向萬物互聯時代的全場景分布式操…

分布式數據庫中間件使用經驗分享

最近公司新項目使用了華為云的DDM分布式數據庫中間件服務&#xff0c;通過一段的時間的使用感覺還不錯。近段時間發現有許多小伙伴也準備去使用這個服務&#xff0c;所以為大家分享一下使用 創建DDM服務的經驗&#xff0c;幫助小伙伴們少走彎路。首先在使用創建DDM實例的時候小…

project設置6天工作制日歷

1.新建工作日歷&#xff0c;取名 2.在“工作周”選項里設置 主要用到的是“工作周” 在project標準日歷里&#xff0c;星期一---星期五是有工作時間&#xff0c;8-12,13-17。星期六&#xff0c;星期日是沒有工作時間的&#xff0c;即非工作日。只要設置工作時間&#xff0c;就…

html5播放器自動全屏,HTML5 video播放器全屏(fullScreen)實現的方法

這篇文章主要介紹了HTML5 video播放器全屏(fullScreen)方法實例,本文直接給出一個完整代碼實例,需要的朋友可以參考下首先來說&#xff0c;這個標題具有誤導性&#xff0c;但這樣設置改標題也是主要因為video使用的比較多在html5中&#xff0c;全屏方法可以適用于很多html 元素…