多项式半家桶

news/2025/2/7 21:40:40/文章来源:https://www.cnblogs.com/hzoi-Cu/p/18703325

基于 NTT 实现(不是任意模数)。

有卷积,求逆,exp,ln,除法。

使用指南明天写。

code
#include<bits/stdc++.h>
namespace PolyBasedNTT{
using std::memset;using std::memcpy;using std::swap;using std::reverse;using std::fill;using std::copy;
#define N LENconst int Mod = 998244353,G = 3,Gi = 332748118;const int LEN = 4e6 + 10;int lastnnn = 0,lastlim = 0,initinvn = 0,_to[N],_inv[N];int qpow(int a,int b,int Mod = Mod){int res = 1;for(;b;b >>= 1,a = 1ll*a*a%Mod)if(b&1) res = 1ll*res*a%Mod;return res;}int invi(int a){return qpow(a,Mod-2,Mod);}template<class T>T FMod(const T x){return x >= Mod?x - Mod:x;}void bfconvolution(int *a,int *b,int lena,int lenb){static int w[N];for(int i = 0;i < lena; ++i) for(int j = 0;j < lenb; ++j)w[i+j] = FMod(w[i+j]+1ll*a[i]*b[j]%Mod);copy(w,w+lena+lenb,a);fill(w,w+lena+lenb,0);}int _prepare(int n){if(lastnnn == n) return lastlim;lastnnn = n;uint lim = 1,ct = -1;while(lim <= n) lim <<= 1,ct++;for(int i = 0;i < lim; ++i) _to[i] = (_to[i>>1]>>1)|((i&1)<<ct);return (lastlim = lim);}void mult(int *f,int *g,int len){for(int i = 0;i < len; ++i) f[i] = 1ll*f[i]*g[i]%Mod;}void clear(int *f,int len,int val = 0){memset(f,val,4*len);}void cpy(int *f,int *g,int len){memcpy(f,g,4*len);}void NTT(int *a,int n,bool type = true){n = _prepare(n);for(int i = 0;i < n; ++i) if(i < _to[i]) swap(a[i],a[_to[i]]);for(int mid = 1;mid < n;mid <<= 1){int W = qpow(type?G:Gi,(Mod-1)/(mid<<1));for(int Res = mid<<1,j = 0;j < n;j += Res){int w = 1;for(int k = 0;k < mid; ++k,w = 1ll*w*W%Mod){int x = a[j+k],y = 1ll*w*a[j+k+mid]%Mod;a[j+k] = FMod(x+y);a[j+k+mid] = FMod(x-y+Mod);}}}}void convolution(int *a,int *b,int n,int m){int len = n + m,llen = invi(_prepare(len)),Len = _prepare(len);static int sav[N];clear(sav,len);cpy(sav,b,len);NTT(a,len);if(a != b) NTT(b,len);for(int i = 0;i < Len; ++i) a[i] = 1ll*a[i]*b[i]%Mod;NTT(a,len,false);for(int i = 0;i < len; ++i) a[i] = 1ll*a[i]*llen%Mod;fill(a+len,a+Len,0);cpy(b,sav,len);}void invp(int *b,int *a,int n){if(n == 1) return b[0] = invi(a[0]),void();invp(b,a,(n+1)>>1);static int c[N];int emm = 2*n-1,len = _prepare(emm);cpy(c,a,n);clear(c+n,len-n+1);NTT(c,emm);NTT(b,emm);for(int i = 0;i < len; ++i) b[i] = FMod(2ll-1ll*b[i]*c[i]%Mod+Mod)*b[i]%Mod;NTT(b,emm,0);int invn = invi(len);for(int i = 0;i < n; ++i) b[i] = 1ll*b[i]*invn%Mod;clear(b+n,len-n+1);}void invp(int *a,int n){static int b[N];invp(b,a,n);cpy(a,b,n+1);clear(b,lastlim);}void sqrtp(int *a,int n){static int b1[N],b2[N],b3[N];int m = n + 1;n = 1;while(n <= m) n <<= 1;b1[0] = 1;for(int len = 2;len <= n;len <<= 1){for(int i = 0;i < (len>>1); ++i) b2[i] = b1[i];for(int i = 0;i < len; ++i) b3[i] = a[i];invp(b2,len);convolution(b3,b2,len,len);for(int i = 0;i < len; ++i) b1[i] = FMod(b1[i]+b3[i])*499122177ll%Mod;clear(b2,lastlim);clear(b3,lastlim);clear(b1+len,lastlim-len);}cpy(a,b1,m);clear(b1,n+n);clear(b2,n+n);clear(b3,n+n);}void rev(int *f,int len){reverse(f,f+len);}void modp(int *f,int *g,int n,int m){static int q[N],t[N];int L = n-m+1;rev(g,m);cpy(q,g,L);rev(g,m);rev(f,n);cpy(t,f,L);rev(f,n);invp(q,L);convolution(q,t,L,L);rev(q,L);fill(q+L,q+lastlim,0);convolution(g,q,n,n);for(int i = 0;i < m-1; ++i) g[i] = FMod(f[i]-g[i]+Mod);cpy(f,q,L);clear(f+L,n-L);clear(q,lastlim);clear(t,lastlim);}void Diff(int *f,int n){for(int i = 0;i < n - 1; ++i) f[i] = 1ll*(i+1)*f[i+1]%Mod;f[n-1] = 0;}void Init(int *inv,int n){if(initinvn >= n) return;if(initinvn == 0){inv[0] = inv[1] = 1;for(int i = 2;i <= n; ++i) inv[i] = 1ll*inv[Mod%i]*(Mod-Mod/i)%Mod;initinvn = n;}else{for(int i = initinvn + 1;i <= n; ++i) inv[i] = 1ll*inv[Mod%i]*(Mod-Mod/i)%Mod;initinvn = n;}}void integral(int *f,int n){Init(_inv,n);for(int i = n; i; --i) f[i] = 1ll*f[i-1]*_inv[i]%Mod;f[0] = 0;}void ln(int *f,int n){static int g[N];cpy(g,f,n);invp(g,n);int LL = lastlim;Diff(f,n);convolution(f,g,n,n);integral(f,n-1);clear(g,LL);}void exp(int *f,int m){static int s[N],s2[N];int n = 1;while(n < m) n <<= 1;n <<= 1;s2[0] = 1;for(int len = 2;len <= n;len <<= 1){cpy(s,s2,len>>1);ln(s,len);for(int i = 0;i < len; ++i) s[i] = FMod(f[i]-s[i]+Mod);s[0] = FMod(s[0] + 1);convolution(s2,s,len,len);}cpy(f,s2,m);clear(s,n);clear(s2,n+n);}
#undef N
}using namespace PolyBasedNTT;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟化技术介绍

一、虚拟化技术简介 虚拟化(Virtualization)的含义很广泛。将任何一种形式的资源抽象成另一种形式的技术都是虚拟化,是资源的一种逻辑表示。解除了物理硬件和操作系统之间的紧耦合关系。虚拟化是云计算的基础。简单地说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚…

地平线 3D 目标检测 Bevformer 参考算法 V2.0

该示例为参考算法,仅作为在 征程 6 上模型部署的设计参考,非量产算法 简介 BEVFormer 是当前热门的自动驾驶系统中的 3D 视觉感知任务模型。BEVFormer 是一个端到端的框架,BEVFormer 可以直接从原始图像数据生成 BEV 特征,无需依赖于传统的图像处理流程。它通过利用 Transf…

.NET周刊【1月第3期 2025-01-19】

国内文章 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始 https://www.cnblogs.com/GreenShade/p/18667671 文章介绍了一款基于树莓派Zero 2W和.NET技术的智能桌面机器人。作者因对该项目的兴趣与网友需求而进行开发。产品结…

AUTOSAR 学习笔记

AUTOSAR 学习笔记 概述 ​ 本文章为0基础小白记录AUTOSAR学习笔记。如有错误,欢迎评论区指正。个人笔记模式习惯采用提问式记录,也是这篇文章的主要记录模式。 补充,大篇幅文章推荐: 《AutoSAR入门到精通系列讲解》作者:雪云飞星 https://blog.csdn.net/xyfx_fhw/category…

Win11环境下安装Oracle Databases 11g 遇到[INS-13001]环境不满足最低要求解决办法

找到你解压后的文件,点击打开database文件夹 -->stage文件夹 -->cvu文件夹 -->cvu_prereq.xml文件,用记事本打开cvu_prereq.xml文件; 在这个<CERTIFIED_SYSTEMS>。。。</CERTIFIED_SYSTEMS>语句之间增加如下代码: ...... <CERTIFIED_SYSTEMS> &…

Zookeeper入门api与应用

一、 说明 Zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态…

马走日(结论题)

这道题本质上,是一道结论题,结论如下: 1.小尺寸处理: 如果点阵的行或列有一个为1,则马无法移动,只能留在起点,此时答案为1。 如果点阵的最小边为2,则马只能沿着较长的边移动,每次移动步长为2,此时答案为较长边的一半加1。 2.中等尺寸处理: 当点阵为3x3时,马无法到达…

[lnsyoj1158] 淘淘蓝蓝之幻影树

dp题意sol 若某一方胜利,则设该方战胜的区间为 \([l_i,r_i]\),那么过程可描述为 \(1\) 打败 \([l_1,r_1]\),\(2\) 打败 \(l_2,r_2\)…………\(k\) 打败 \([l_k,r_k]\)。显然,\(k\) 打败 \([l_k,r_k]\)…………\(2\) 打败 \(l_2,r_2\),\(1\) 打败 \([l_1,r_1]\) 与之等价,…

NAS——强化学习结合CNN

一. 子模型的基本架构子模型由N个卷积单元和M个缩减单元按一定规则排列后加上GAP层、FC层和Softmax层组成。关键:通过引入卷积单元和缩减单元,充分发挥了CNN模型强大的特征提取能力。 整个结构中后面三层是确定的,中间的卷积单元和缩减单元要从搜索空间中获取。 二. 搜索空间…

Learn Learn Go Reverse

根据做题学习 [i春秋ezgo]Go栈扩容的逻辑,这里无需关注。具体汇编代码输入函数与输出函数系统学习go reverse 参考文章: https://forum.butian.net/share/1874 Go基础 见 https://forum.butian.net/share/1874 查看Go版本 //一、查看版本号 go version xx.exe //二、查看地址以…

Learn Learn Android Reverse

安卓基础 NDK开发 jni调用什么是jni?jni是Java Native lnterface的缩写。从java1.1开始,jni标准成为Java平台的一部分,允许Java代码和其他语言写的代码进行交互GetStringUTFChars();将java字符串转换为c字符串.java的字符串在虚拟机中,通过硬编码调用,cstring在内存中.env-&g…

2016蓝桥杯省赛B组

2016蓝桥杯省赛B组 1.煤球数目#include<bits/stdc++.h>using namespace std;int dp[200];int main(){ int sum=0; for(int i=1;i<=100;i++){ dp[i]=dp[i-1]+i; sum+=dp[i]; } cout<<sum; return 0;} 思路: 每一层煤球个数 0+1-&g…