当前位置: 首页 > news >正文

NTT学习笔记(快速数论变换)

一些概念

欧拉函数 ϕ ( n ) \phi(n) ϕ(n)

欧拉函数简介

g g g n n n互质,则令 g x % n = 1 g^x\%n=1 gx%n=1的最小正整数 x x x称为 g g g n n n的阶。

原根

对于互质的两个正整数 g g g n n n,如果 g g g n n n的阶为 ϕ ( n ) \phi(n) ϕ(n),则称 g g g n n n的原根。

求原根

一般的原根都比较小,暴力枚举即可。


NTT

前置知识:快速傅里叶变换( F F T FFT FFT

F F T FFT FFT中,我们选择 n n n次单位复根作为 x x x的值,因为他们满足消去引理、折半引理、求和引理,所以可以用分治的方法将时间复杂度变为 O ( n log ⁡ n ) O(n\log n) O(nlogn)。但因为用了复数,所以在精度上有误差。而在一些题目要求的是带模的多项式乘法,所以 F F T FFT FFT就用不了了。那么,我们能不能让 x x x取整数值,使得这个值也能满足消去引理、折半引理、求和引理呢?

ϕ ( m ) = r × 2 d \phi(m)=r\times 2^d ϕ(m)=r×2d,令 n = 2 d n=2^d n=2d x n i = x ϕ ( m ) × i / n ( m o d m ) x_n^i=x^{\phi(m)\times i/n}\pmod m xni=xϕ(m)×i/n(modm),其中 i ≤ n i\leq n in

x n i x_n^i xni有以下性质:

1. 消去引理

x d n d k = x n k ( m o d m ) x_{dn}^{dk}=x_n^k\pmod m xdndk=xnk(modm)

证明: x d n d k = x ϕ ( m ) × d k / d n = x ϕ ( m ) × k / n = x n k ( m o d m ) x_{dn}^{dk}=x^{\phi(m)\times dk/dn}=x^{\phi(m)\times k/n}=x_n^k\pmod m xdndk=xϕ(m)×dk/dn=xϕ(m)×k/n=xnk(modm)

2. 折半引理

( x n k + n / 2 ) 2 = x n / 2 k ( m o d m ) (x_n^{k+n/2})^2=x_{n/2}^k \pmod m (xnk+n/2)2=xn/2k(modm)

证明: ( x n k + n / 2 ) 2 = x n 2 k + n = x n 2 k = x n / 2 k ( m o d m ) (x_n^{k+n/2})^2=x_n^{2k+n}=x_n^{2k}=x_{n/2}^k\pmod m (xnk+n/2)2=xn2k+n=xn2k=xn/2k(modm)

3. 求和引理

∑ i = 0 n − 1 ( x n k ) j = 0 ( m o d m ) \sum\limits_{i=0}^{n-1}(x_n^k)^j=0\pmod m i=0n1(xnk)j=0(modm)

证明: ∑ i = 0 n − 1 ( x n k ) j = 1 − ( x n k ) n 1 − x n k = 0 1 − x n k = 0 \sum\limits_{i=0}^{n-1}(x_n^k)^j=\dfrac{1-(x_n^k)^n}{1-x_n^k}=\dfrac{0}{1-x_n^k}=0 i=0n1(xnk)j=1xnk1(xnk)n=1xnk0=0


那么,用 x x x来代替 F F T FFT FFT中的 ω \omega ω,其他不变,就可以求带模数的多项式乘法了。

模数的限制

若模数 m = r × 2 k + 1 m=r\times 2^k+1 m=r×2k+1(其中 r r r为奇数, k k k为整数),则多项式乘积的次数不能超过 2 k 2^k 2k

如果题目没有模数,那也可以取一个较大的模数,保证答案的每一位都小于这个模数,用这个模数来做 N T T NTT NTT也是可以的。

一些模数的原根

模数原根最大长度
998244353 = 119 × 2 23 + 1 998244353=119\times 2^{23}+1 998244353=119×223+1 3 3 3 2 23 2^{23} 223
469762049 = 7 × 2 26 + 1 469762049=7\times 2^{26}+1 469762049=7×226+1 3 3 3 2 26 2^{26} 226
2281701377 = 17 × 2 27 + 1 2281701377=17\times 2^{27}+1 2281701377=17×227+1 3 3 3 2 27 2^{27} 227

例题

多项式乘法(FFT)

#include<bits/stdc++.h>
using namespace std;
const long long g=3,mod=998244353;
long long w,wn,a1[5000005],a2[5000005];
long long mi(long long t,long long v){if(v==0) return 1;long long re=mi(t,v/2);re=re*re%mod;if(v&1) re=re*t%mod;return re;
}
void ch(long long *a,int l){for(int i=1,j=l/2,k;i<l-1;i++){if(i<j) swap(a[i],a[j]);k=l/2;while(j>=k){j-=k;k>>=1;}j+=k;}
}
void ntt(long long *a,int l,int fl){for(int i=2;i<=l;i<<=1){if(fl==1) wn=mi(g,(mod-1)/i);else wn=mi(g,mod-1-(mod-1)/i);for(int j=0;j<l;j+=i){w=1;for(int k=j;k<j+i/2;k++,w=w*wn%mod){long long t=a[k],u=w*a[k+i/2]%mod;a[k]=(t+u)%mod;a[k+i/2]=(t-u+mod)%mod;}}}if(fl==-1){long long ny=mi(l,mod-2);for(int i=0;i<l;i++) a[i]=a[i]*ny%mod;}
}
int main()
{int n=1,l1,l2;scanf("%d%d",&l1,&l2);++l1;++l2;while(n<l1+l2) n<<=1;for(int i=0;i<l1;i++){scanf("%lld",&a1[i]);}for(int i=0;i<l2;i++){scanf("%lld",&a2[i]);}ch(a1,n);ch(a2,n);ntt(a1,n,1);ntt(a2,n,1);for(int i=0;i<n;i++){a1[i]=a1[i]*a2[i]%mod;}ch(a1,n);ntt(a1,n,-1);for(int i=0;i<l1+l2-1;i++) printf("%lld ",a1[i]);return 0;
}

相关文章:

NTT学习笔记(快速数论变换)

一些概念 欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 欧拉函数简介 阶 若 g g g和 n n n互质&#xff0c;则令 g x % n 1 g^x\%n1 gx%n1的最小正整数 x x x称为 g g g模 n n n的阶。 原根 对于互质的两个正整数 g g g和 n n n&#xff0c;如果 g g g模 n n n的阶为 ϕ ( n ) \phi…...

Android类似微信首页的页面开发教程(Kotlin)二

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …...

PAt A1015 Reversible Primes

1015 Reversible Primes 分数 20 作者 CHEN, Yue 单位 浙江大学 A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its rever…...

解决Lemuroid识别不到蓝牙键盘的问题

Android系统基于libretro的全能游戏模拟器&#xff0c;目前有RetroArch&#xff0c;Kodi&#xff0c;Lemuroid。 而且这三个都是开源免费的APP。 Lemuroid相对前面两个功能比较简陋。也不能自己下载核心。但代码也是最少的。 在使用Lemuroid的时候&#xff0c;发现它不能检测…...

SpringBoot 使用 Sa-Token 完成权限认证

一、设计思路 所谓权限认证&#xff0c;核心逻辑就是判断一个账号是否拥有指定权限&#xff1a; 有&#xff0c;就让你通过。没有&#xff1f;那么禁止访问&#xff01; 深入到底层数据中&#xff0c;就是每个账号都会拥有一个权限码集合&#xff0c;框架来校验这个集合中是…...

Spring核心与设计思想、创建与使用

文章目录 一、Spring是什么二、为什么要学习框架三、IoC和DI&#xff08;一&#xff09;IoC1. 认识IoC2. Spring的核心功能 &#xff08;二&#xff09;DI 四、Spring项目的创建&#xff08;一&#xff09;使用 Maven 方式创建一个 Spring 项目 五、Spring项目的使用&#xff0…...

mysql 备份 还原

1:备份 执行命令方案1: /usr/local/mysql/bin/mysqldump -uX -pX -h 127.0.0.1 --set-gtid-purgedOFF --skip-extended-insert --add-drop-table --add-locks --create-options --disable-keys --lock-tables --quick --set-charset -e --max_allowed_packet16777216 --net_b…...

每日学术速递4.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.AutoNeRF: Training Implicit Scene Representations with Autonomous Agents 标题&#xff1a;AutoNeRF&#xff1a;使用自主代理训练隐式场景表示 作者&#xff1a;Pierre Marz…...

RabbitMQ使用StringRedisTemplate-防止重复消费

造成重复消费的原因&#xff1a; MQ向消费者推送message&#xff0c;消费者向MQ返回ack&#xff0c;告知所推送的消息消费成功。但是由于网络波动等原因&#xff0c;可能造成消费者向MQ返回的ack丢失。MQ长时间&#xff08;一分钟&#xff09;收不到ack&#xff0c;于是会向消…...

临沂大学张继群寄语

目录 寄语 1、不能有不良睹好 2、坚毅的个性和勤奋的品质 3、会存钱...

线程学习笔记

1:Thread 线程的生命周期控制 2:Runnable 可执行的任务和程序 3:Callable 执行程序后返回结果 4:Future 收集程序返回结果 5:Executor 线程池 6:ForkJoin 默认线程池 每个线程有工作队列 工作窃取 7:RunnableFuture FutureTask 实现 Runnable 和 Future 执…...

代码随想录算法训练营第四十二天|01背包问题,你该了解这些!、01背包问题,你该了解这些! 滚动数组 、416. 分割等和子集

文章目录 01背包问题&#xff0c;你该了解这些&#xff01;01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组416. 分割等和子集 01背包问题&#xff0c;你该了解这些&#xff01; 题目链接&#xff1a;代码随想录 二维数组解决0-1背包问题 解题思路&#xff1a; 1.dp…...

结构体指针、数组指针和结构体数组指针

结构体指针 首先让我们定义结构体&#xff1a; struct stu { char name[20]; long number; float score[4]; }; 再定义指向结构体类型变量的指针变量&#xff1a; struct stu *student; /*定义结构体类型指针*/ student malloc(sizeof(struct stu)); /*为指针变量分…...

项目架构一些注意点

考虑系统的 稳定性 一、微服务的稳定性 1、如何解决那些不稳定的因素/问题&#xff1f;也是常说的如何容错。 2、一个系统的高可用取决于它本身和其强依赖的组件的高可用 3、消除单点 保活机制 健康检查 注册中心如何保障稳定性 注册中心集群 微服务本身对注册信息的本地持…...

Forefront GPT-4免费版:开启无限畅聊时代,乐享人工智能快感,无限制“白嫖”,还能和N多角色一起聊天?赶紧注册,再过些时间估计就要收费了

目录 前言注册登录方式应用体验聊天体验绘图体验 “是打算先免费后收费吗&#xff1f;”建议其它资料下载 前言 近期&#xff0c;人工智能技术迎来重大飞跃&#xff0c;OpenAI的ChatGPT等工具成为全球数亿人探索提高生产力和增强创造力的新方法。人们现在可以使用人工智能驱动…...

深入浅出 Compose Compiler(1) Kotlin Compiler KCP

前言 Compose 的语法简洁、代码效率非常高&#xff0c;这主要得益于 Compose Compiler 的一系列编译期魔法&#xff0c;帮开发者生成了很多样板代码。但编译期插桩也阻碍了我们对于 Compose 运行原理的认知&#xff0c;想要真正读懂 Compose 就必须先了解它的 Compiler。本系列…...

BatchNormalization和LayerNormalization的理解、适用范围、PyTorch代码示例

文章目录 为什么要NormalizationBatchNormLayerNormtorch代码示例 学习神经网络归一化时&#xff0c;文章形形色色&#xff0c;但没找到适合小白通俗易懂且全面的。学习过后&#xff0c;特此记录。 为什么要Normalization 当输入数据量级极大或极小时&#xff0c;为保证输出数…...

大数据 | 实验二:文档倒排索引算法实现

文章目录 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;在本地编写程序和调试&#x1f955;代码框架思路&#x1f955;代码实现 &#x1f407;在集群上提交作业并执行&#x1f955;在集群上提交作业并执行&#xff0c;同本地执行相比即需修改…...

Java文档注释-JavaDoc标签

标签含义author指定作者{code}使用代码字体以原样显示信息&#xff0c;不处理HTML样式deprecated指定程序元素已经过时{docRoot}指定当前文档的根目录路径exception标识由方法或构造函数抛出的异常{inheritDoc}从直接超类中继承注释{link}插入指向另外一个主题的内联链接{linkp…...

黑盒测试过程中【测试方法】详解5-输入域,输出域,猜错法

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...