Polynomial

news/2025/2/11 20:10:18/文章来源:https://www.cnblogs.com/EmilyDavid/p/18710389
#include<bits/stdc++.h>using namespace std;const int mo=998244353;
const int maxn=1<<20;int add(int x,int y){return (x+y>=mo)?x+y-mo:x+y;
}int sub(int x,int y){return (x-y<0)?x-y+mo:x-y;
}int mul(int x,int y){return 1ll*x*y%mo;
}#define gc getchar
int rd(){int f=1,r=0;char ch=gc();while(!isdigit(ch)){ if(ch=='-') f=-1;ch=gc();}while(isdigit(ch)){ r=(r<<1)+(r<<3)+(ch^48);ch=gc();}return f*r;
}int ksm(int x,int y){int rs=1;while(y){if(y&1) rs=1ll*rs*x%mo;x=1ll*x*x%mo;y>>=1;}return rs;
}int rev[maxn];	void init_rev(int len){for(int i=0;i<len;++i){rev[i]=rev[i>>1]>>1;if(i&1) rev[i]|=len>>1;}
}namespace Polynomial{struct poly{int a[maxn];poly(){memset(a,0,sizeof(a));};int& operator[](int x){return a[x];}int operator[](int x)const{return a[x];}void operator=(const poly &t){memcpy(a,t.a,sizeof(a));return;}void slice(int len,int k){for(int i=len;i<k;++i) a[i]=0;}void NTT(int len,int rv){for(int i=0;i<len;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int h=2;h<=len;h<<=1){int wn=ksm(3,(mo-1)/h);for(int i=0;i<len;i+=h){int w=1;for(int k=i;k<i+h/2;++k){int u=a[k],v=mul(w,a[k+h/2]);a[k]=add(u,v);a[k+h/2]=sub(u,v);w=mul(w,wn);}}}if(rv==-1){reverse(a+1,a+len);int inv=ksm(len,mo-2);for(int i=0;i<len;++i) a[i]=mul(a[i],inv);}}poly inv(int len)const{poly g,g0,d;g[0]=ksm(a[0],mo-2);for(int lim=2;(lim>>1)<len;lim<<=1){g0=g,d=*this;d.slice(lim,len);int k=lim<<1;init_rev(k);g0.NTT(k,1),d.NTT(k,1);for(int i=0;i<k;++i) g0[i]=mul(g0[i],sub(2,mul(g0[i],d[i])));g0.NTT(k,-1);g0.slice(lim,k);g=g0;}return g;}poly der(int len)const{poly g=*this;for(int i=0;i<len;++i) g[i]=mul(g[i+1],i+1);return g;}poly integ(int len)const{poly g=*this;for(int i=len-1;i;--i) g[i]=mul(g[i-1],ksm(i,mo-2));g[0]=0;return g;}poly ln(int len)const{poly d=this->der(len),iv=this->inv(len),rs;int k=len<<1;init_rev(k);d.NTT(k,1),iv.NTT(k,1);for(int i=0;i<k;++i) rs[i]=mul(d[i],iv[i]);rs.NTT(k,-1);rs=rs.integ(k);rs.slice(len,k);return rs;}poly Exp(int len)const{poly g,g0,lng,d;g[0]=1;int k;for(int lim=2;(lim>>1)<len;lim<<=1){k=lim<<1;g0=g,lng=g.ln(k),d=*this;d.slice(lim,k);lng.slice(lim,k);init_rev(k);g0.NTT(k,1),lng.NTT(k,1),d.NTT(k,1);for(int i=0;i<k;++i) g[i]=mul(g0[i],add(sub(1,lng[i]),d[i]));g.NTT(k,-1);g.slice(lim,k);}g.slice(len,k);return g;}poly Mul(int len,int k)const{poly rs=*this;for(int i=0;i<len;++i) rs[i]=mul(rs[i],k);return rs;}poly pow(int len,int k)const{poly rs=this->ln(len);rs=rs.Mul(len,k);rs=rs.Exp(len);return rs;}poly rv(int len)const{poly rs=*this;reverse(rs.a,rs.a+len);return rs;}pair<poly,poly> modulo(int n,int m,const poly g)const{poly rf=this->rv(n+1),rg=g.rv(m+1),q,r;rf.slice(n-m+1,n+1),rg.slice(n-m+1,m+1);int k=1;while(k<=(n-m+1)) k<<=1;rg=rg.inv(k);while(k<=(n-m+1)*2) k<<=1;init_rev(k);rf.NTT(k,1),rg.NTT(k,1);for(int i=0;i<k;++i) q[i]=mul(rf[i],rg[i]);q.NTT(k,-1);q.slice(n-m+1,k);q=q.rv(n-m+1);poly f=*this,G=g;k=1;while(k<=2*max(n+1,m+1)) k<<=1;init_rev(k);f.NTT(k,1),G.NTT(k,1),q.NTT(k,1);for(int i=0;i<k;++i) r[i]=sub(f[i],mul(q[i],G[i]));r.NTT(k,-1),q.NTT(k,-1);q.slice(n-m+1,k);r.slice(m,k);return make_pair(q,r);}};
}
using namespace Polynomial;

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

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

相关文章

一语总结

一语总结 真心建议把找到的一些性质和做法以文字形式写下来,当掉不过样例的时候一个一个检查其正确性。”P9169 [省选联考 2023] 过河卒“用DFS将环当作平局是错误的因为这可能只是一个不优的必胜/必败局面,正确的做法是老实建图按拓扑序跑BFS。就这个结论的错误害我虚空调题…

软考高级《系统架构设计师》知识点(二)

操作系统知识 操作系统概述操作系统定义:能有效地组织和管理系统中的各种软/硬件资源,合理地组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。 操作系统有三个重要的作用:管理计算机中运行的程序和分配各种软硬件资源; 为用户提供…

Linux驱动---LED

本文介绍了 Linux 内核中的 pinctrl 子系统和 GPIO 子系统,并通过编写 RGB 三色灯驱动程序,展示了如何在实际应用中使用这两个子系统来控制硬件设备目录一、pinctrl子系统二、GPIO子系统三、GPIO操作步骤3.1、获取GPIO描述符3.2、设置方向3.3、读写值四、编写LED驱动4.1、硬件…

PVE 服务器通过脚本进行优化

此处使用的优化脚本为pve_source.tar.gz,需要的可以自己从网上下载‌pve_source‌是一款用于Proxmox VE(PVE)的辅助脚本,主要用于一键换源、更新系统、升级系统、开启直通等功能,能够方便地进行PVE虚拟机的配置和管理,提高工作效率。‌ 一、上传并运行优化脚本 1、首先我…

018 Module的语法

历史上,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成相互依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何方面的支持都没有,这对开发大型的、复杂的项目形成…

另辟新径实现 Blazor/MAUI 本机交互(三)

新建一个Maui blazor工程, 下面是工程关键文件解析. MainPage.xaml.cs 构造函数:通过 FindByName 方法查找名为 webView 的 WebView 控件,并将其赋值给 wvBrowser 变量。 创建 NativeBridge 的实例 api,并将 wvBrowser 传递给它。 使用 api.AddTarget 方法添加一个名为 dial…

nodejs如何处理Token?一文深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

前端开发中关于Token的那些事儿:深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

Eddystone 与 iBeacon

Eddystone 与 iBeacon 蓝牙信标 (Beacons) 是一种单向通讯方式,所以一般的用途就是发送提醒。 Beacons 是指使用蓝牙4.0(BLE)技术发射信号的小设备。 目前存活的 Beacons 标准有两个,分别是 Google 的 Eddystone 和 Apple 的 iBeacon. Eddystone Eddystone 是谷歌基于 Beac…

OrangePi 5 编译 Android12 源码

OrangePi 5 编译 Android12 源码 材料准备 源码下载地址 Orange Pi - Orangepi官方教程编译环境 在以下环境的 Ubuntu 虚拟机编译通过,基于 VMware Workstation 17 Pro.系统版本:ubuntu-18.04.6-lts-desktop-amd64; CPU:i5-8400,为 VM 分配 4 核; 内存:8G RAM + 16G swap…

Maui 基础 - Preferences 存储和检索应用程序的首选项

Maui 基础 Preferences 是 .NET MAUI 提供的一个静态类,用于存储和检索应用程序的首选项(即设置或配置)。它提供了一种简单的键值对存储机制,可以跨平台使用。每个平台使用其本地的存储机制来实现这些功能,例如:iOS 使用 NSUserDefaults Android 使用 SharedPreferences …