update on 21.12.30:新增了polyeva
;修補了polymod
處多測時可能產生的 bug。
update on 22.2.7:重 寫(前一版太醜了),改為完全封裝版本(使用std::vector
存放多項式係數,運算在命名空間polynomial::
裡)
實現的並不優秀,但應該很穩(霧)。全部提交測試過,部分由vincra
這個賬號提交。
ver 1
變數/常量:
n
:多項式次數。
djq g invg
:模數、該模數的乙個原根、該原根的逆元。
ar1~ar5
:不知道起什麼名字的輔助陣列。
ivg~img
:看名字大概能猜出來什麼用的輔助陣列。
rev1 rev2
:蝴蝶變換陣列。
函式(pulic
):
若無特殊說明,整數、多項式係數均為 \(\pmod \) 意義下。
ksm(a,b)
:求 \(a^b\);快速冪;\(o(\log b)\)。
modsqrt(a)
:求 \(a^}\);原根 + bsgs;\(o(\sqrt )\)。
initrev(n,lgn,l,rev)
:預處理\(\pmod\) 意義下 ntt 所用的蝴蝶變換陣列;暴力;\(o(n)\)。
ntt(a,n,opt,rev)
:以 \(rev\) 作為蝴蝶變換陣列,對 \(a(x)\pmod\) 做快速數論變換(\(n^\) 放在外面乘);ntt;\(o(n\log n)\)。
polymul(a,b,c,n)
:求 \(c(x)=a(x)b(x)\pmod}\);ntt;\(o(n\log n)\)。
polyinv(a,b,n)
:求 \(b(x)=a^(x)\pmod\);牛頓迭代 + ntt;\(o(n\log n)\)。
polydif(a,b,n)
:求 \(b(x)=\dfraca(x)}x}\pmod\);微分;\(o(n)\)。
polyint(a,b,n)
:求 \(b(x)=\int a(x)\mathrmx\pmod\);積分;\(o(n)\)。
polysqrt(a,b,n)
:求 \(b(x)=a^}(x)\pmod\)(對\(a_0\) 無要求);牛頓迭代 + ntt;\(o(n\log n)\)。
polyln(a,b,n)
:求 \(b(x)=\ln a(x)\pmod\)(由麥克勞林級數定義);復合函式微分 + 積分 + ntt;\(o(n\log n)\)。
polyexp(a,b,n)
:求 \(b(x)=\exp a(x)\pmod\)(由麥克勞林級數定義);牛頓迭代 +polyln
;\(o(n\log n)\)。
polymod(a,b,c,n,m,d)
:有 \(a(x)\pmod\) 和 \(b(x)\pmod\) (\(m),求 \(d(x)=a(x)\bmod\pmod}\),\(c(x)=b^(x)(a(x)-d(x))\pmod}\);暴力 +polyinv
;\(o(n\log n)\)
polyksm(a,b,k,n)
:求 \(b(x)=a^k(x)\pmod\)(要求 \(a_0=1\));初中數學 +polyln
+polyexp
;\(o(n\log n)\)。
sppolyksm(a,b,k1,k2,lim,n)
:求 \(b(x)=a^k(x)\pmod\)(對\(a_0\) 無要求),其中 \(k1=k\pmod\) , \(k1=k\pmod\) , \(lim=\min(k,p)\)(用於特判);暴力 +polyksm
;\(o(n\log n)\)。
polyeva(a,b,n,m)
:給出 \(a(x)\pmod\) 和 \(x_1\ldots x_m\),輸出 \(a(x_1)\ldots a(x_m)\)。(多點快速求值)
const int n=100005,djq=998244353;
class poly
void cdq(ll* f,ll* g,int l,int r)
ll *p[4*n]; int len[4*n];
void up(int x)
void solve(int x,int l,int r,ll* a)
public:
inline int ksm(ll base,int p) return ret;
}inline int modsqrt(int x)
inline void initrev(const int n,int& lgn,int& l,int* rev)
void ntt(ll* a,const int l,const int opt,int* rev)
void polycdq(ll* a,ll* b,const int n,const int va)
void polyeva(ll* a,ll* x,const int n,const int m)
}work;
ver 2(施工中)const int djq=998244353;
inline int ksm(int base,int p)
return ret;
}namespace polynomial
inline int modsqrt(int x)
inline int initrev(const int n)
inline void ntt(poly &a,const int len,const int opt)
poly qpow(poly a,const int k,const int n)
}
多項式運算
多項式運算 順序棧實現 在demo1.cpp基礎上增加 彌補異常處理 以及多位數運算缺點 include include include define ok 1 define error 2 define overflow 1 define ini size 100 typedef int elem...
VC多項式運算
多項式運算主要是係數和指數的處理,本文用乙個簡單的例子實現該功能。首先,新建控制台應用程式 然後,新建類 標頭檔案 polynomial.h inte ce for the cpolynomial class.if defined afx polynomial h 06b9bccd 1789 483...
2 10多項式及其運算
1 多項式的表達與建立 matlab約定n次多項式用乙個長度為n 1的係數行向量來表示,按降冪排列,缺少的冪次項係數為0.2 多項式的運算 多項式的運算由四則運算符和運算函式組成,主要如下 1 多項式加減運算,維數必須相同 2 多項式乘運算 利用函式c conv a,b 3 多項式除運算 利用函式 ...