首页 > 其他分享 >luoguP5383 普通多项式转下降幂多项式 题解

luoguP5383 普通多项式转下降幂多项式 题解

时间:2022-12-24 09:00:25浏览次数:33  
标签:tmp lc int 多项式 mid 题解 luoguP5383 underline

学习了 bztMinamoto 大佬的做法,希望这篇题解可以使得那个方法更加易于理解。

既然下降幂多项式转普通多项式可以采取分治 \(\operatorname{NTT}\),那么可以猜测逆过来也可以。(分治除法???)

引理:考虑,\(\forall j>i\),都有 \(x^{\underline{j}}\bmod x^{\underline{i}}=0\),那么,如果我们只是求 \(x^{\underline{i}}\) 项的系数,我们可以直接把原式模 \(x^{\underline{i+1}}\),再除以 \(x^{\underline{i}}\) 获得答案。(以下除法均为带余除法,如果没有写明取余数,均只取商)。

如果对于每个位置都做两次除法,会导致大量重复计算,所以可以考虑分治做。

具体做法:

我们记 \(D_{l,r}\),表示:

\[D_{l,r}=\prod_{i=l}^{r-1}(x-i) \]

我们通过分治 \(\operatorname{NTT}\) 处理出 \(D_{l,r}\),于是 \(x^{\underline{i}}\),也就是 \(D_{0,i}\) 可以通过 \(O(\log n)\) 个区间合并出来。

不过当然不必如此繁琐,假设我们正在处理 \([l,r)\) 这段区间中下降幂多项式的系数,且已经得到:

\[F'(x)=\frac{F(x)\bmod x^{\underline{r}}}{x^{\underline{l}}} \]

那么,我们将 \(F'(x)\) 除以 \(D_{l,mid}\),将余数放入左子区间,商放入右子区间递归处理即可。

时间复杂度 \(\mathcal O(n\log^{2}n)\)。

关键代码:

using namespace Poly_NTT;

const int N = 1 << 18;
int n;
poly F[N << 2], D[N << 2], ans;
#define lc (k << 1)
#define rc ((k << 1) | 1) 
void calc(int k, int l, int r) {//代码中均为闭区间
	if (l == r) {
		D[k] = poly(vector <ll> {(mo - l) % mo, 1});
		return;
	}
	int mid = (l + r) >> 1;
	calc(lc, l, mid);
	calc(rc, mid + 1, r);
	D[k] = D[lc] * D[rc];
}
pair <poly, poly> tmp;
void solve(int k, int l, int r) {
	if (l == r) {
		ans[l] = F[k][0];
		return;
	}
	int mid = (l + r) >> 1;
	tmp = F[k] / D[lc];//second为余数,first为商。
	F[lc] = tmp.second;
	F[rc] = tmp.first;
	solve(lc, l, mid);
	solve(rc, mid + 1, r); 
}
int main() {
	read(n);
	F[1].resize(n); ans.resize(n);
	for (int i = 0; i < n; ++i) {
		read(F[1][i]);
	}
	calc(1, 0, n - 1);
	solve(1, 0, n - 1);
	ans.print();
	return 0;
}

相信大家都有自己的板子了,完整的就不放了,运算符还是很好理解的吧。

标签:tmp,lc,int,多项式,mid,题解,luoguP5383,underline
From: https://www.cnblogs.com/lazytag/p/17001987.html

相关文章

  • CF1765J Hero to Zero 题解
    题意给出长为\(n\)数组\(a,b\),令\(c_{i,j}=|a_i-b_j|\)。每次可以花\(1\)的代价让矩阵\(c\)的一行或一列或一个格子减\(1\),也可以花\(-1\)的代价让一行或一列......
  • # Win10为知笔记Docker镜像部署 -v /wiz/storage问题解决
    Win10为知笔记Docker镜像部署-v/wiz/storage问题解决用了很长一段时间的为知笔记,客户端体验还行,服务端笔记同步体验不佳。准备用Docker自己搭一个服务端。环境:操作......
  • 前端竞态问题解决方法
    主要是通过 AbortController来终止前一个请求。例如:useEffect(()=>{//创建controllerconstcontroller=newAbortController();//将controller作......
  • uniapp配合xcode打包遇到videoPlayer module is not added的问题解决
     这个情况是因为没有配置相关插件,虽然在uniapp中提示添加但是这对于我们自己xcode打包毫无意义,这儿配置的很多东西都是给uniapp云端打包提示添加对应功能的xcode本地打......
  • CF1537D 题解
    前言题目传送门!更好的阅读体验?遇到这种博弈论的题目,当然是要打表找规律了!思路首先,很容易想到暴力递推。代码在上方的链接里。然后看几眼就能发现,在大部分情况下,如果......
  • Codeforces 1630 E Expected Components 题解 (组合数学)
    题目链接首先明确概念:排列。指的就是一个把数组a重排得到的序列,两个排列相等当且仅当它们对应位全都相等环形排列。指的是把数组a重排得到的序列首尾相接得到的环形数......
  • CF1753B 题解
    \(\mathcalPreface\)题目传送门\(\mathcalSolution\)定理:\(n!\cdot(n+1)=(n+1)!\)这题就是围绕以上定理展开的。如果加入一个数\(a_i\)满足\(\operatornam......
  • Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决
    前言在学习《Python从入门到精通(第2版)》的第15章GUI界面编程——15.2.4将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学有所帮助。问......
  • [省选联考 2021 B 卷] 数对 题解
    题目描述给定\(n\)个正整数\(a_i\),请你求出有多少个数对\((i,j)\)满足\(1\lei\len\),\(1\lej\len\),\(i\nej\)且\(a_i\)是\(a_j\)的倍数。提示对于......
  • chrome使用拖拽本地扩展时无法安装的问题解决办法
    在使用Chrome拖拽安装本地扩展时会提示无法安装,可以采用以下两个方法解决1、修改.crx文件文件格式为zip,并进行解压,然后打开扩展安装界面的开发者模式,使用加载已解压的扩展......