[Luogu P5050] 【模板】多項式多點求值
洛谷傳送門
題目描述
給定一個
次多項式
,現在請你對於
輸入輸出格式
輸入格式:
第一行兩個正整數 表示多項式的次數及你要求的點值的數量。
第二行 個非負整數,由低到高地給出多項式的係數。
第三行 個非負整數,表示 。
輸出格式:
一共 行,每行 個非負整數。
第 行的數字表示 。
答案對 取模。
輸入輸出樣例
輸入樣例#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
說明
, , 表示 的 次項係數
解題分析
很妙的做法。(程式碼也長的一…)
對於 , 我們將其分為兩部分, 構造兩個多項式 。
然後我們發現, 對於 , , 所以我們直接將原多項式對 取模, 遞迴處理即可。 同樣對右半部分進行處理。
計算 和 先用分治 處理, 存在 中。
注意隨時清空輔助的陣列!! 否則極可能會莫名其妙 !!
總複雜度 。
程式碼如下:
#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