1. 程式人生 > >[Luogu P5050] 【模板】多項式多點求值

[Luogu P5050] 【模板】多項式多點求值

洛谷傳送門

題目描述

給定一個 n n 次多項式 f ( x ) f(x)

,現在請你對於 i [ 1 , m ] i \in [1,m]
,求出 f ( a i ) f(a_i)

輸入輸出格式

輸入格式:

第一行兩個正整數 n

, m n,m 表示多項式的次數及你要求的點值的數量。

第二行 n + 1 n+1 個非負整數,由低到高地給出多項式的係數。

第三行 m m 個非負整數,表示 a i a_i

輸出格式:

一共 m m 行,每行 1 1 個非負整數。

i i 行的數字表示 f ( a i ) f(a_i)

答案對 998244353 998244353 取模。

輸入輸出樣例

輸入樣例#1:

10 10
18 2 6 17 7 19 17 6 2 12 14
4 15 5 20 2 6 20 12 16 5

輸出樣例#1:

18147258
804760733
161737928
73381527
23750
973451550
73381527
525589927
842520242
161737928

說明

n , m [ 1 , 64000 ] n,m \in [1,64000] a i , [ x i ] f ( x ) [ 0 , 998244352 ] a_i,[x^i]f(x) \in [0,998244352] [ x i ] f ( x ) [x^i]f(x) 表示 f ( x ) f(x) i i 次項係數

解題分析

很妙的做法。(程式碼也長的一…)

對於 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n , 我們將其分為兩部分, 構造兩個多項式 g ( x ) = ( x a 1 ) ( x a 2 ) . . . ( x a n 2 ) , h ( x ) = ( x a n 2 + 1 ) . . . ( a n ) g(x)=(x-a_1)(x-a_2)...(x-a_{\lfloor \frac{n}{2}\rfloor}),h(x)=(x-a_{\lfloor\frac{n}{2}\rfloor+1})...(a_n)

然後我們發現, 對於 i [ 1 , n 2 ] i\in[1,\lfloor\frac{n}{2}\rfloor] g ( a i ) 0 ( m o d   x n ) g(a_i)\equiv 0(mod\ x^n) , 所以我們直接將原多項式對 g ( x ) g(x) 取模, 遞迴處理即可。 同樣對右半部分進行處理。

計算 g ( x ) g(x) h ( x ) h(x) 先用分治 N T T NTT 處理, 存在 v e c t o r vector 中。

注意隨時清空輔助的陣列!! 否則極可能會莫名其妙 W A WA !!

總複雜度 O ( N l o g 2 ( N ) ) O(Nlog^2(N))

程式碼如下:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <cassert>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 400500
#define ll long long
#define MOD 998244353
#define g 3
#define Ginv 332748118
template <class T>
IN void in(T &x)
{
	x = 0; R char c = gc;
	for (; !isdigit(c); c = gc);
	for (;  isdigit(c); c = gc)
	x = (x << 1) + (x << 3) + c - 48;
}
IN int fpow(R int base, R int tim)
{
	int ret = 1;
	W (tim)
	{
		if (tim & 1) ret = 1ll * ret * base % MOD;
		base = 1ll * base * base % MOD, tim >>= 1;
	}
	return ret;
}
int n, m;
std::vector <int> dv[MX], A;
int a[MX], b[MX], c[MX], d[MX], e[MX], rev[MX], val[MX], GR[MX], DR[MX], FR[MX], buf[MX];
namespace Poly
{
	IN void NTT(int *dat, R int len, R int typ)
	{
		for (R int i = 1; i < len; ++i) if (rev[i] > i) std::swap(dat[rev[i]], dat[i]);
		R int seg, step, bd, now, cur, buf1, buf2, base, deal;
		for (seg = 1; seg < len; seg <<= 1)
		{
			base = fpow(typ ? g : Ginv, (MOD - 1) / (seg << 1)), step = seg << 1;
			for (now = 0; now < len; now += step)
			{
				bd = now + seg, deal = 1;
				for (cur = now; cur < bd; ++cur, deal = 1ll * deal * base % MOD)
				{
					buf1 = dat[cur], buf2 = 1ll * dat[cur + seg] * deal % MOD;
					dat[cur] = (buf1 + buf2) % MOD, dat[cur + seg] = (buf1 - buf2 + MOD) % MOD;
				}
			}
		}
		if (typ) return; int inv = fpow(len, MOD - 2);
		for (R int i = 0; i < len; ++i) dat[i] = 1ll * dat[i] * inv % MOD;
	}
	void CDQ(R int now, R int lef, R int rig)
	{
		if (lef == rig)
		{
			dv[now].push_back((MOD - val[lef] + MOD) % MOD);
			dv[now].push_back(1);
			return;
		}
		int mid = lef + rig >> 1, ls = now << 1, rs = now << 1 | 1;
		CDQ(ls, lef, mid), CDQ(rs, mid + 1, rig);
		int up = rig - lef + 1, len = 1, lg = 0, lsiz = mid - lef + 1, rsiz = rig - mid;
		for (; len <= up; len <<= 1, lg++);
		for (R int i = 1; i < len; ++i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << lg - 
            
           

相關推薦

[Luogu P5050] 模板多項式

洛谷傳送門 題目描述 給定一個 n n n次多項式

[洛谷P5050]模板多項式

題目大意:給你一個$n$次多項式$f(x)$,以及$m$個$x_i$,對於$i\in[1,m]$,求$f(x_i)$ 題解:多項式多點求值 令$g(x)=\prod\limits_{i=1}^m(x-x_i)$,求出$R(x)$使得$f(x)=Q(x)\times g(x)+R(x)$。因為當$x=x_i

[FFT]luogu 3803 模板多項式乘法

thml -a tdi 問題 none gif details 可能 target 題目背景 這是一道FFT模板題 註意:雖然本題開到3s,但是建議程序在1s內可以跑完,本題需要一定程度的常數優化。 題目描述 給定一個n次多項式F(x),和一個m次多項式G(x)。 請求出F

Luogu 4725 模板多項式對數函數

但是 += src none 復雜 \n 過程 display rac 繼續補全模板。 要求 $$g(x) = ln f(x)$$ 兩邊求導, $$g‘(x) = \frac{f‘(x)}{f(x)}$$ 然後左轉去把多項式求導和多項式求逆的模板復制過來,就可以計

多項式和插

\(orz~fjzzq\) 多項式多點求值 給定一個多項式 \(F(x)\) 求出對於每個點 \(x_i\) 的 \(F(x_i)\) 考慮分治 設 \[L(x)=\prod_{i=0}^{\frac{n}{2}}(x-x_i),R(x)=\prod_{i=\frac{n}{2}+1}^n(x-x_i)\

多項式

Preface 首先我們需要的前置知識有: 多項式取模 餘式定理 多項式取模可以看這裡 餘式定理的內容是這樣的: 對於多項式F(x),其在x=x0處的點值等於F(x) mod (x-x0) 因為除式是個一次式,那麼餘式一定是一個常數

luogu P3388 模板(割頂)

true algorithm fin can clas light fine sca 表示 題目背景 割點 題目描述 給出一個n個點,m條邊的無向圖,求圖的割點。 輸入輸出格式 輸入格式: 第一行輸入n,m 下面m行每行輸

luogu P3388 模板(割頂)

edge {} struct next 聯通 說明 () getc urn 題目背景 割點 題目描述 給出一個n個點,m條邊的無向圖,求圖的割點。 輸入輸出格式 輸入格式: 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式

[Luogu] P3806 模板分治1

oid sca stream 存在 pac main 長度 code namespace 題目背景 感謝hzwer的點分治互測。 題目描述 給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。 輸入輸出格式 輸入格式: n,m 接下來n-1條邊a,b,

模板 Luogu P3388 模板(割頂)

題目描述:戳這裡 題解: 邊雙的模板題啦。 我們可以考慮tarjan刷有向圖的環的方法,只要稍稍修改,就能AC了。 我們需要注意一下兩點: 1.對於每一個點,只要它的任意下一層的子樹中有一個點

luogu P3387 模板_拓撲排序

for include esp space cst sca lld ring lse Code: #include <stack> #include <cstdio> #include <algorithm> #include

Luogu P3375 模板KMP字符串匹配

ogr oss tel 詳解 最長 arch tro long abc P3375 【模板】KMP字符串匹配 題目描述 如題,給出兩個字符串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。 為了減少騙分的情況,接下來還要輸出子串的前綴數組

luogu P3368 模板樹狀數組 2

進行 print sin spa 初始 nbsp 增加 樹狀 () P3368 【模板】樹狀數組 2 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數數加上x 2.求出某一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數

原創洛谷 LUOGU P3373 模板線段樹2

取模 file 需要 code ace highlight dig org zh-cn P3373 【模板】線段樹 2 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.將某區間每一個數乘上x 3.求出

紅黑樹 ------ luogu P3369 模板普通平衡樹(Treap/SBT)

div child lin main false tchar clas char als 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) 近幾天閑來無事。。。就把各種平衡樹都寫了一下。。。 下面是紅黑樹(Red Black Tree)

替罪羊樹 ------ luogu P3369 模板普通平衡樹(Treap/SBT)

nod %d clas https number problem 普通 true ble 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) 閑的沒事,把各種平衡樹都寫寫 比較比較。。。 下面是替罪羊樹 #include &l

數組splay ------ luogu P3369 模板普通平衡樹(Treap/SBT)

普通 模板 char truct div color fine col suffix 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) #include <cstdio> #define Max 100005

luogu P3809 模板後綴排序

二次 [] == suffix fix turn read max reg 二次聯通門 : luogu P3809 【模板】後綴排序 /* luogu P3809 【模板】後綴排序 後綴數組 sa表示 排名為i的是第幾

luogu P3370 模板字符串哈希

pro href 給定 ring std namespace 興趣 scanf clu 題目描述 如題,給定N個字符串(第i個字符串長度為Mi,字符串內包含數字、大小寫字母,大小寫敏感),請求出N個字符串中共有多少個不同的字符串。 友情提醒:如果真的想好好練習哈希

fhq treap ------ luogu P3369 模板普通平衡樹(Treap/SBT)

ret true read std stdin urn tdi ref code 二次聯通門 : LibreOJ #104. 普通平衡樹 #include <cstdio> #include <iostream> #include