我的多項式全家桶板子

2022-05-21 00:51:10 字數 3792 閱讀 6293

博主最近心血來潮,貼貼全家桶。

本多項式全家桶包含了:多項式乘法,多項式求逆,多項式求ln,多項式求exp,多項式除法,多項式取模,多項式多點求值,以及乙個為了多點求值用的分治ntt。

由於時代變了,博主的多點求值使用了常數較小的版本。

#include #define i inline

#define fi first

#define se second

#define ll long long

#define mp make_pair

#define pii pair#define fo(i, a, b) for(int i = a; i <= b; i++)

#define fd(i, a, b) for(int i = a; i >= b; i--)

#define ull unsigned long long

using namespace std;

const int inf = 2147483647;

const int mod = 998244353;

const int n = 1 << 17;

i int _max(int x, int y)

i int _min(int x, int y)

i ll read()

while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();

return x * f;

}i void ptt(ll x)

i void put(ll x)

i void pr1(ll x)

i void pr2(ll x)

i int pow_mod(int a, int k)

namespace poly return len;

} i int pre(int n)

i int gao(int x)

i void dft(int y, int len)

i void idft(int y, int len)

i void clear(int y, int len)

i void clear(int a, int s, int t)

i void cpy(int a, int b, int len)

i void cpy(int a, vectorb)

i void cpy(vector&a, int b, int len)

i void getinv(int a, int b, int len)

getinv(a, b, len >> 1); cpy(h, a, len), clear(b, len);

fo(i, 0, (len << 1) - 1) r[i] = (r[i >> 1] >> 1) | ((i & 1) ? len : 0);

dft(h, len << 1), dft(b, len << 1);

fo(i, 0, (len << 1) - 1) b[i] = (2 - (ll)b[i] * h[i]) % mod * b[i] % mod;

idft(b, len << 1); clear(b, len);

} i void getln(int a, int b, int len)

const int z = 16;

int mem1[n * 10], z[n << 1]; ull mem2[n * 10], g[n << 1];

i void solve(int l, int r, int *memp1, ull *memp2) return ;

} int len = (r - l + 1) / z, ll = len << 1;

fo(i, 0, ll - 1) r[i] = (r[i >> 1] >> 1) | ((i & 1) ? (ll >> 1) : 0);

int *h1[z]; ull *h2[z];

fo(i, 0, z - 1) if(l == 0)

} fo(i, 0, z - 1)

} i void getexp(int a, int b, int len)

int c[n << 1];

i void getpw(int a, int b, int k, int len)

int v[n << 1];

i void mul(int a, int b, int len1, int len2)

cpy(v, b, len2), clear(a, len1, len), clear(v, len2, len);

dft(a, len), dft(v, len);

fo(i, 0, len - 1) a[i] = (ll)a[i] * v[i] % mod;

idft(a, len); clear(a, len1 + len2 - 1, len);

} i void mult(int a, int b, int len1, int len2) cpy(a, v, len1 - len2 + 1), clear(a, len1 - len2 + 1, len);

return ;

} cpy(v, b, len2), reverse(v, v + len2), clear(v, len2, len), clear(a, len1, len);

dft(a, len), dft(v, len);

fo(i, 0, len - 1) a[i] = (ll)a[i] * v[i] % mod;

idft(a, len); fo(i, 0, len1 - len2) a[i] = a[i + len2 - 1]; clear(a, len1 - len2 + 1, len);

} int h1[n << 1], h2[n << 1];

i void getdiv(int a, int b, int c, int n, int m)

i void getmod(int a, int b, int c, int n, int m)

vectorg[n << 1], f[n << 1]; int d[n], a[n << 1], b[n << 1];

i void gao1(int u, int l, int r) int mid = l + r >> 1;

gao1(u << 1, l, mid), gao1(u << 1 | 1, mid + 1, r);

cpy(a, g[u << 1]), cpy(b, g[u << 1 | 1]);

mul(a, b, mid - l + 2, r - mid + 1);

cpy(g[u], a, r - l + 2);

} i void gao2(int u, int l, int r)

int mid = l + r >> 1;

cpy(a, f[u]), cpy(b, g[u << 1 | 1]);

mult(a, b, r - l + 2, r - mid + 1);

cpy(f[u << 1], a, mid - l + 2);

cpy(a, f[u]), cpy(b, g[u << 1]);

mult(a, b, r - l + 2, mid - l + 2);

cpy(f[u << 1 | 1], a, r - mid + 1);

gao2(u << 1, l, mid), gao2(u << 1 | 1, mid + 1, r);

} i void getval(int a, int b, int n, int m)

}int main()

多項式全家桶

眾所周知,生成函式是乙個十分強大的東西,許多與多項式相關的演算法也就應運而生了,在這裡選取幾種較為簡單的演算法做乙個介紹.p.s.這篇文章在去年noi前已經完成了一半,現在筆者將其補充完整後發出,同時也為了紀念那一段美好的時光。已知 f x 求 g x 使得 f x g x equiv 1 mod ...

多項式全家桶

已知多項式 g x 求 f x 滿足 g f x equiv 0 pmod 假設我們有乙個 f 0 x 滿足 g f 0 x equiv 0 pmod rceil 由定義可知 f x f 0 x equiv 0 pmod rceil rightarrow forall k ge 2,left f x...

多項式全家桶

include include includeusing namespace std const double pi acos 1.0 const int maxn 1e7 5 inline int read int n,m,len,lim 1 int r maxn struct complex c...