日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

「多项式除法」

發布時間:2024/1/3 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 「多项式除法」 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

「多項式除法」

前置知識

多項式乘法

多項式乘法逆

基本問題

給定一個 (n) 次多項式 (F(x)) 和一個 (m) 次多項式 (G(x)),求 (A(x)) 和 (B(x)) 滿足

[F(x)=A(x)G(x)+B(x)
]

顯然 (A(x)) 的次數為 (n - m),(B(x)) 的次數 (leq m - 1) 。

新定義

[A_R(x)=x^nA(frac{1}{x})
]

容易發現 (A_R(x)) 的系數是 (A(x)) 的系數 (reverse) 得到的。

簡單證明

[A(x)=sum^{n}_{i=0}a_ix^i
]

[A(frac{1}{x})=sum^{n}_{i=0}a_ix^{-i}
]

[A_R(x)=x^nA(frac{1}{x})=sum^{n}_{i=0}a_ix^{n-i}=sum^{n}_{i=0}a_{n-i}x^i
]

[A_R(x)=sum^{n}_{i=0}a_{n-i}x^i
]

證畢

[ecause F(x)=A(x)G(x)+B(x)
]

[F(frac{1}{x})=A(frac{1}{x})G(frac{1}{x})+B(frac{1}{x})
]

兩邊同乘 (x^n)

[x^nF(frac{1}{x})=x^{n-m}A(frac{1}{x})x^mG(frac{1}{x})+x^{n-m+1}x^{m-1}B(frac{1}{x})
]

[F_R(x)=A_R(x)G_R(x)+x^{n-m+1}B_R(x)
]

[F_R(x)equiv A_R(x)G_R(x)(mod;x^{n-m+1})
]

[A_R(x)equiv F_R(x)G_R^{-1}(x)(mod;x^{n-m+1})
]

然后通過 (reverse) 操作得到 (A(x))

[B(x)=F(x)-A(x)G(x)
]

代碼
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

typedef long long ll;
typedef unsigned long long ull;

using namespace std;

const int maxn = 3e5 + 50, INF = 0x3f3f3f3f, mod = 998244353, inv3 = 332748118;

inline int read () {
	register int x = 0, w = 1;
	register char ch = getchar ();
	for (; ch < '0' || ch > '9'; ch = getchar ()) if (ch == '-') w = -1;
	for (; ch >= '0' && ch <= '9'; ch = getchar ()) x = x * 10 + ch - '0';
	return x * w;
}

inline void write (register int x) {
	if (x / 10) write (x / 10);
	putchar (x % 10 + '0');
}

int n, m;
int f[maxn], g[maxn];
int fr[maxn], gr[maxn], ngr[maxn];
int rev[maxn], res[maxn];
int A[maxn], B[maxn];

inline int qpow (register int a, register int b, register int ans = 1) {
	for (; b; b >>= 1, a = 1ll * a * a % mod) 
		if (b & 1) ans = 1ll * ans * a % mod;
	return ans;
} 

inline void NTT (register int len, register int * a, register int opt) {
	for (register int i = 1; i < len; i ++) if (i < rev[i]) swap (a[i], a[rev[i]]);
	for (register int d = 1; d < len; d <<= 1) {
		register int w1 = qpow (opt, (mod - 1) / (d << 1));
		for (register int i = 0; i < len; i += d << 1) {
			register int w = 1;
			for (register int j = 0; j < d; j ++, w = 1ll * w * w1 % mod) {
				register int x = a[i + j], y = 1ll * w * a[i + j + d] % mod;
				a[i + j] = (x + y) % mod, a[i + j + d] = (x - y + mod) % mod;
			}
		}
	}
}

inline void Poly_Inv (register int d, register int * a, register int * b) {
	if (d == 1) return b[0] = qpow (a[0], mod - 2), void ();
	Poly_Inv ((d + 1) >> 1, a, b);
	register int len = 1, bit = 0;
	while (len < (d << 1)) len <<= 1, bit ++;
	for (register int i = 0; i < len; i ++) res[i] = 0, rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit - 1);
	for (register int i = 0; i < d; i ++) res[i] = a[i];
	NTT (len, res, 3), NTT (len, b, 3);
	for (register int i = 0; i < len; i ++) b[i] = ((2ll * b[i] % mod - 1ll * res[i] * b[i] % mod * b[i] % mod) % mod + mod) % mod;
	NTT (len, b, inv3);
	register int inv = qpow (len, mod - 2);
	for (register int i = 0; i < d; i ++) b[i] = 1ll * b[i] * inv % mod;
	for (register int i = d; i < len; i ++) b[i] = 0;
}

inline void Division (register int * f, register int * g) { // 除法
	Poly_Inv (n - m + 1, gr, ngr);
	register int len = 1, bit = 0;
	while (len <= 2 * n - m + 1) len <<= 1, bit ++;
	for (register int i = 0; i < len; i ++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit - 1);
	NTT (len, fr, 3), NTT (len, ngr, 3);
	for (register int i = 0; i < len; i ++) A[i] = 1ll * fr[i] * ngr[i] % mod;
	NTT (len, A, inv3);
	register int inv = qpow (len, mod - 2);
	for (register int i = n - m + 1; i < len; i ++) A[i] = 0;
	for (register int i = n - m; i >= 0; i --) printf ("%d ", A[i] = 1ll * A[i] * inv % mod); putchar ('
');
	reverse (A, A + n - m + 1);
}

inline void Remainder (register int * f, register int * g) { // 取膜
	register int len = 1, bit = 0;
	while (len <= n) len <<= 1, bit ++;
	for (register int i = 0; i < len; i ++) res[i] = 0, rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit - 1);
	NTT (len, A, 3), NTT (len, g, 3);
	for (register int i = 0; i < len; i ++) res[i] = 1ll * A[i] * g[i] % mod;
	NTT (len, res, inv3);
	register int inv = qpow (len, mod - 2);
	for (register int i = 0; i <= m - 1; i ++) printf ("%lld ", ((f[i] - 1ll * res[i] * inv % mod) % mod + mod) % mod); putchar ('
');
}

int main () {
	n = read(), m = read();
	for (register int i = 0; i <= n; i ++) f[i] = fr[n - i] = read();
	for (register int i = 0; i <= m; i ++) g[i] = gr[m - i] = read();
	Division (f, g), Remainder(f, g);
	return 0;
}

總結

以上是生活随笔為你收集整理的「多项式除法」的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线观看无遮挡 | 国产精品边吃奶边做爽 | 亚洲一二三级 | 国产二区精品视频 | 男男肉耽高h彩漫 | 国产精品久久久久久69 | 逼特逼视频在线观看 | 天堂网av在线播放 | 色噜噜在线播放 | 欧洲成人在线视频 | 成人蜜桃av | www黄色大片 | 日韩精品视频一区二区三区 | 极品销魂美女少妇尤物 | 香蕉网址 | 亚洲av毛片成人精品 | 久久久久久久久久久网 | 波多野结衣一本一道 | 色多多在线看 | 九九精品免费 | 少妇激情四射 | 久久高清无码视频 | 亚洲综合久久久 | 加勒比一区二区 | 色综合一区二区三区 | 亚洲一区在线看 | 欧美r级在线观看 | 亚洲 在线 | 天天拍天天操 | 国产成人啪免费观看软件 | 丝袜国产在线 | 一级免费黄色片 | 亚洲欧美日韩在线不卡 | 波多野结衣一区二区三区四区 | 国产精品毛片在线 | 国产黄a三级三级看三级 | 伊人久久中文字幕 | 日韩极品少妇 | 91超碰国产在线 | 日韩18p| 国产日韩一区二区三免费高清 | 久久黄色影院 | 国产真实生活伦对白 | 一区二区三区国 | 国产精品无码天天爽视频 | 欧美少妇网 | 国产夫妻在线 | 小早川怜子久久精品中文字幕 | 亚洲网站在线看 | jizz国产 | 草久久久 | 日韩一区二区视频在线播放 | 午夜影院免费体验区 | 国产精品成人在线 | 午夜精品久久久久久久久久蜜桃 | 久久色婷婷 | 欧美人成在线视频 | 中国国产毛片 | 日韩一级欧美一级 | 激情四虎 | 7m精品福利视频导航 | 三级av免费看 | 亚洲国产精品成人综合色在线婷婷 | 奶波霸巨乳一二三区乳 | 国产资源在线播放 | 亚洲最大av| 免费看毛片的网站 | 日韩欧美国产亚洲 | 成人深夜福利在线观看 | 亚洲一区二区三区电影在线观看 | 人成在线观看 | 狠狠躁夜夜躁人人爽天天高潮 | 免费黄色成人 | 国产精品视频第一页 | 91av视频网站 | 999久久精品 | 亚洲精品一区二区在线观看 | 亚洲欧洲国产日韩 | 亚洲女人的天堂 | 日韩99 | 精品人伦一区二区三区蜜桃免费 | 精品人妻伦一二三区久 | 国产一区欧美日韩 | 天天综合日日夜夜 | 日朝毛片 | 乱lun合集男男高h | 欧美日韩在线免费观看视频 | 香蕉av一区二区 | www.黄在线| aaa一级黄色片 | 欧美日韩精品一区二区三区 | 黄色综合 | 亚洲第一成年人网站 | 好吊妞视频在线 | 亚洲视频在线一区 | 日韩三级av在线 | 99re在线视频 | 综合激情在线 | 欧美xxxxx少妇 |