<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      多項式板子

      多項式板子

      我是面向過程愛好者。

      有時間大概會改 DFT 的實現,現在的速度還行。

      f != g 表示 fg 不是同一個數組,未加說明 \(f, g\) 都是多項式。

      函數(都可以在 ExP:: 中找到):

      int Up(n):返回 \(\ge n\) 的第一個 \(2\) 的次冪。

      void Dft(f, l = 2^k):對長為 \(l\)\(f\) 做 DFT,更改原數組。

      void Idf(f, l = 2^k):對長為 \(l\) 的 對 \(f\) 做 IDFT,更改原數組。

      void Add(f, g, l = 2^k):對長為 \(l\)\(f,g\) 做和卷積,放到 \(f\) 里,不更改 \(g\) 的值。

      void Sub(f, g, l = 2^k):對長為 \(l\) 的 對 \(f,g\) 做差卷積,放到 \(f\) 里,不更改 \(g\) 的值。

      void Inv(f, g != f, l = 2^k):對長為 \(l\)\(f\) 求逆,放到 \(g\) 里。

      void Sqrt(f, g != f, l = 2^k):對長為 \(l\)\(f\) 開根,需滿足 \(f_0 = 1\),放到 \(g\) 里。

      void Div(f, g != f, h != g, l = 2^k):對長為 \(l\)\(f,g\)\(\frac fg\),放到 \(g\) 里,快于求逆后卷積。

      void Ln(f, g != f, l = 2^k):對長為 \(l\)\(f\)\(\ln\)需滿足 \(f_0 = 1\),放到 \(g\) 里。

      void Exp(f, g != f, l = 2^k):對長為 \(l\)\(f\)\(\exp\)需滿足 \(f_0 = 0\),放到 \(g\) 里。

      void Der(f, g, l = 2^k):對長為 \(l\)\(f\) 求導,放到 \(g\) 里。

      void Int(f, g, l = 2^k):對長為 \(l\)\(f\) 積分,放到 \(g\) 里。

      int Bt(f, g, l = 2^x, k):對長為 \(l\)\(f,g\)\([x^k]\frac fg\)

      還有一點優化時的函數,沒啥用。

      int Dbl(f, l = 2^k):對長為 \(l\)點值 \(f\),用更快的速度(兩次長為 \(n\) 的 FFT)求出長為 \(2n\) 的點值。

      int Dinv(f, g, h, l = 2^k):對長為 \(l\)\(f\)點值 \(g, h\),其中 \(h = \hat{q}, f = \frac 1q \bmod {x ^ l}, g = \hat{f}\),迭代出 \(f = \frac 1q \bmod {x ^ {2l}}\),會更改 \(h\),不會更改 \(g\)

      能過板子題,不保證沒問題。

      Code
      int Fpw(int a, int b){
      	int ans = 1;
      	for(; b; a = 1ll * a * a % MOD, b >>= 1) if(b & 1) ans = 1ll * ans * a % MOD;
      	return ans;
      }
      
      namespace OpP{
      	int Wn[N << 1], inv[N];
      	int Up(int n){ return pow(2, ceil(log(n) / log(2))); }
      	struct INIT{ INIT(){
      		int n = 1 << __lg(N), *p = Wn; *p = 1;
      		for(int i = 1; i < n; i <<= 1){
      			int w = Fpw(G, (MOD - 1) / (i << 1)), v = 1;
      			for(int j = 0; j < i; ++j) *++p = v, v = 1ll * v * w % MOD;
      		}
      		inv[0] = 1; for(int i = 1; i <= n; ++i) inv[i] = 1ll * inv[i - 1] * i % MOD;
      		inv[n] = Fpw(inv[n], MOD - 2);
      		for(int i = n; i; --i) inv[i - 1] = 1ll * exchange(inv[i], 1ll * inv[i] * inv[i - 1] % MOD) * i % MOD;
      	} } Initer;
      	void Dft(int *f, int l){
      		for(int i = 0, j = 0; i < l; ++i){
      			if(i < j) swap(f[i], f[j]);
      			for(int k = l >> 1; (j ^= k) < k; k >>= 1) ;
      		}
      		for(int k = 1; k < l; k <<= 1)
      			for(int i = 0; i < l; i += k << 1)
      				for(int j = 0, *p = Wn + k; j < k; ++j, ++p){
      					llt a = f[i + j], b = 1ll * (*p) * f[i + j + k];
      					f[i + j] = (a + b) % MOD, f[i + j + k] = (a - b) % MOD;
      				}
      	}
      	void Idf(int *f, int l){
      		Dft(f, l), reverse(&f[0] + 1, &f[0] + l);
      		for(int i = 0, v = inv[l]; i < l; ++i) f[i] = 1ll * f[i] * v % MOD;
      	}
      }
      namespace ExP{
      	using namespace OpP;
      #define fk (k >> 1)
      #define Set(a, l) memset(a, 0, sizeof(*a) * (l))
      #define Cpy(a, b, l) memcpy(a, b, sizeof(*a) * (l))
      	void Dbl(int *f, int l){
      		int a[N]; Cpy(a, f, l);
      		Idf(f, l);
      		for(int i = 0, *p = Wn + l; i < l; ++i, ++p) f[i] = 1ll * f[i] * (*p) % MOD;
      		Dft(f, l);
      		for(int i = l << 1; ~i; --i) f[i] = i & 1 ? f[i >> 1] : a[i >> 1];
      	}
      	void Add(int *f, int *g, int l){
      		int t[N]; Cpy(t, g, l);
      		Dft(f, l), Dft(t, l);
      		for(int i = 0; i < l; ++i) f[i] = 1ll * f[i] * t[i] % MOD;
      		Idf(f, l);
      	}
      	void Sub(int *f, int *g, int l){
      		int t[N]; Cpy(t, g, l);
      		Idf(f, l), Dft(t, l);
      		for(int i = 0; i < l; ++i) f[i] = 1ll * f[i] * t[i] % MOD;
      		Dft(f, l);
      	}
      	void Dinv(int *f, int *g, int *h, int l){
      		for(int i = 0; i < l; ++i) h[i] = 1ll * h[i] * g[i] % MOD;
      		Idf(h, l), Set(h, l >> 1), Dft(h, l);
      		for(int i = 0; i < l; ++i) h[i] = 1ll * h[i] * g[i] % MOD;
      		Idf(h, l);
      		for(int i = l >> 1; i < l; ++i) f[i] = -h[i];
      	}
      	void Inv(int *f, int *g, int l){
      		int ta[N], tb[N];
      		Set(ta, l), Set(tb, l), Set(g, l);
      		g[0] = Fpw(f[0], MOD - 2);
      		for(int k = 2; k <= l; k <<= 1){
      			Cpy(ta, f, k), Cpy(tb, g, k);
      			Dft(ta, k), Dft(tb, k), Dinv(g, tb, ta, k);
      		}
      	}
      	void Sqrt(int *f, int *g, int l){
      		int ta[N], tb[N], tc[N], th[N];
      		Set(ta, l), Set(tb, l), Set(tc, l), Set(th, l), Set(g, l);
      		assert(f[0] == 1 || f[0] == 1 - MOD), ta[0] = g[0] = 1, th[0] = 1; int i2 = (MOD + 1) >> 1;
      		for(int k = 2; k <= l; k <<= 1){
      			for(int i = 0; i < fk; ++i) ta[i] = 1ll * ta[i] * ta[i] % MOD;
      			Idf(ta, fk);
      			for(int i = 0; i < fk; ++i) ta[i + fk] = (ta[i] - f[i]) % MOD, ta[i] = 0;
      			for(int i = fk; i < k; ++i) ta[i] = (ta[i] - f[i]) % MOD;
      			Dft(ta, k), Cpy(tb, th, k), Dft(tb, k);
      			for(int i = 0; i < k; ++i) ta[i] = 1ll * ta[i] * tb[i] % MOD;
      			Idf(ta, k);
      			for(int i = fk; i < k; ++i) g[i] = -1ll * ta[i] * i2 % MOD;
      			if(k != l) Cpy(ta, g, k), Dft(ta, k), Cpy(tc, ta, k), Dinv(th, tb, tc, k);
      		}
      	}
      	void Div(int *f, int *g, int *h, int l){
      		int ta[N], tb[N], tc[N], th[N];
      		Set(ta, l), Set(tb, l), Set(tc, l), Set(th, l), Set(h, l);
      		th[0] = Fpw(g[0], MOD - 2), h[0] = 1ll * th[0] * f[0] % MOD;
      		for(int k = 2; k <= l; k <<= 1){
      			Cpy(tb, g, k), Dft(tb, k), Cpy(ta, h, k), Dft(ta, k);
      			for(int i = 0; i < k; ++i) ta[i] = 1ll * ta[i] * tb[i] % MOD;
      			Idf(ta, k), Set(ta, fk);
      			for(int i = fk; i < k; ++i) ta[i] = (ta[i] - f[i]) % MOD;
      			Dft(ta, k), Cpy(tc, th, k), Dft(tc, k);
      			for(int i = 0; i < k; ++i) ta[i] = 1ll * ta[i] * tc[i] % MOD;
      			Idf(ta, k);
      			for(int i = fk; i < k; ++i) h[i] = -ta[i];
      			if(k != l) Dinv(th, tc, tb, k);
      		}
      	}
      	inline void Der(int *f, int *g, int l){
      		for(int i = 1; i < l; ++i) g[i - 1] = 1ll * f[i] * i % MOD;
      		g[l - 1] = 0;
      	}
      	inline void Int(int *f, int *g, int l){
      		for(int i = l - 1; i; --i) g[i] = 1ll * f[i - 1] * inv[i] % MOD;
      		g[0] = 0;
      	}
      	void Ln(int *f, int *g, int l){
      		assert(f[0] == 1 || f[0] == 1 - MOD); int t[N];
      		Der(f, g, l), Div(g, f, t, l), Int(t, g, l);
      	}
      	void Exp(int *f, int *g, int l){
      		int ta[N], tb[N], tc[N], td[N], th[N]; assert(f[0] == 0);
      		Set(ta, l), Set(tb, l), Set(tc, l), Set(td, l), Set(g, l), tc[0] = g[0] = 1, th[0] = 1;
      		for(int k = 2; k <= l; k <<= 1){
      			Cpy(tb, th, fk), Dft(tb, fk);
      			for(int i = 0; i < fk; ++i) td[i] = (1ll * tb[i] * tc[i] - 1) % MOD;
      			Dbl(td, fk);
      			for(int i = 0, *p = Wn + fk, t; t = 1ll * i * fk % k, i < k; ++i)
      				td[i] = 1ll * td[i] * (t < fk ? p[t] : -p[t - fk]) % MOD;
      			Der(f, tc, fk), Dft(tc, k);
      			for(int i = 0; i < k; ++i) td[i] = 1ll * td[i] * tc[i] % MOD;
      			Idf(td, k), Der(g, ta, fk), Dft(ta, fk);
      			for(int i = 0; i < fk; ++i) ta[i] = 1ll * ta[i] * tb[i] % MOD;
      			Idf(ta, fk), Der(f, tc, k);
      			for(int i = 0; i < fk - 1; ++i) ta[i + fk] = (1ll * ta[i + fk] + ta[i] - tc[i]) % MOD, ta[i] = 0;
      			for(int i = fk - 1; i < k - 1; ++i) ta[i] = (ta[i] - tc[i]) % MOD;
      			for(int i = fk; i < k - 1; ++i) ta[i] = (ta[i] - td[i]) % MOD;
      			Int(ta, ta, k), Add(ta, g, k);
      			for(int i = fk; i < k; ++i) g[i] = -ta[i];
      			if(k != l) Cpy(ta, g, k), Dft(ta, k), Cpy(tc, ta, k), Cpy(tb, th, k), Dft(tb, k), Dinv(th, tb, ta, k);
      		}
      	}
      	int Bt(int *cf, int *cg, int l, int k){
      		int f[N], g[N], i2 = (MOD + 1) >> 1;
      		Cpy(f, cf, l), Cpy(g, cg, l), Dft(f, l), Dft(g, l);
      		for(; k; k >>= 1){
      			Dbl(f, l), Dbl(g, l);
      			if(k & 1){
      				for(int i = 0; i < l; ++i)
      					f[i] = (1ll * f[i] * g[i ^ l] - 1ll * f[i ^ l] * g[i]) % MOD * i2 % MOD;
      				for(int i = l - 1, *p = Wn + l + 1; i; --i, ++p)
      					f[i] = 1ll * f[i] * (-*p) % MOD;
      			}else for(int i = 0; i < l; ++i)
      				f[i] = (1ll * f[i] * g[i ^ l] + 1ll * f[i ^ l] * g[i]) % MOD * i2 % MOD;
      			for(int i = 0; i < l; ++i) g[i] = 1ll * g[i] * g[i ^ l] % MOD;
      		}
      		Idf(f, l), Idf(g, l);
      		return 1ll * f[0] * Fpw(g[0], MOD - 2) % MOD;
      	}
      #undef fk
      #undef Set
      #undef Cpy
      }
      
      posted @ 2025-06-14 20:19  xrlong  閱讀(44)  評論(1)    收藏  舉報

      Loading

      主站蜘蛛池模板: 亚洲av区一区二区三区| 国产乱码精品一区二三区| 国产97人人超碰CAO蜜芽PROM| 巨熟乳波霸若妻在线播放| 色一乱一伦一图一区二区精品| 国产一区二区在线有码| 日韩有码中文字幕国产| 午夜福利yw在线观看2020| 十八禁国产精品一区二区| 国产亚洲欧美精品久久久| 国内在线视频一区二区三区| 日韩人妻少妇一区二区三区| 在线视频不卡在线亚洲| 国产精品有码在线观看| 久久国产自偷自免费一区| 久久婷婷综合色丁香五月| 在线观看中文字幕国产码| 国产精品亚韩精品无码a在线| 亚洲色成人网站www永久下载| 无码精品国产VA在线观看DVD| 亚洲男人第一无码av网站| 中文字幕在线日韩| 国产成人亚洲综合图区| 2021国产精品一卡2卡三卡4卡| 久久热这里只有精品66| 国产乱妇乱子在线视频| 国产福利深夜在线观看| 国产精品国产亚洲看不卡| 好男人视频免费| 久久精品国产亚洲精品色婷婷| 免费一区二三区三区蜜桃| 亚洲尤码不卡av麻豆| 中文字幕日韩有码国产| 国产高清乱码又大又圆| 狠狠色噜噜狠狠狠888米奇视频| 亚洲欧美日韩久久一区二区| 91密桃精品国产91久久| 99久久99这里只有免费费精品| 久久ww精品w免费人成| 一区二区三区放荡人妻| 亚洲日韩图片专区第1页|