数论
文章平均质量分 68
Weach
学生
展开
-
FFT中蝴蝶变换
首先我们有一个bitbitbit位的二进制数的所有组合构成的数组(即[1,2bit)[1,2^{bit})[1,2bit)的所有数)其组合所有方案数为len=2bitlen=2^{bit}len=2bit则我们从小到大求每个数的二进制翻转的数公式:reverse[x]=⌊reverse⌊x2⌋2⌋+(x(mod2))∗(len2)reverse[x]=\lfloor \frac{reverse \lfloor \frac{x}{2} \rfloor}{2} \rfloor+(x\pmod2)*(\原创 2021-08-25 19:35:12 · 1056 阅读 · 0 评论 -
快速傅里叶变换 FFT 学习笔记
概述离散傅里叶变换(Discrete Fourier Transform,缩写为 DFT),是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其 DTFT 的频域采样。FFT 是一种高效实现 DFT 的算法,称为快速傅立叶变换(Fast Fourier Transform,FFT)。它对傅里叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。快速数论变换 (NTT) 是快速傅里叶变换(FFT)在数论基础上的实现。在 1965 年,Coo原创 2021-08-24 16:33:25 · 356 阅读 · 0 评论 -
bsgs(求解高次同余方程)学习笔记
基础篇BSGS(baby-step giant-step),即大步小步算法。常用于求解离散对数问题。形式化地说,该算法可以在 O(p)O(\sqrt{p})O(p) 的时间内求解ax≡b(modp)a^x \equiv b \pmod pax≡b(modp)其中 a⊥pa\perp pa⊥p。方程的解 xxx 满足 0≤x<p0 \le x < p0≤x<p。(在这里需要注意,只要 a⊥pa\perp pa⊥p 就行了,不要求 ppp 是素数)例题:3846 [TJOI200原创 2021-08-23 12:32:47 · 259 阅读 · 0 评论 -
拉格朗日插值学习笔记
P4781 【模板】拉格朗日插值方法 3:拉格朗日插值法根据多项式除法那么我们会有:f(x)≡f(a)(mod(x−a))f(x)\equiv f(a)\pmod{(x-a)}f(x)≡f(a)(mod(x−a))这是显然的,因为 f(x)−f(a)=(a0−a0)+a1(x1−a1)+a1(x2−a2)+⋯+an(xn−an)f(x)-f(a)=(a_0-a_0)+a_1(x^1-a^1)+a_1(x^2-a^2)+\cdots +a_n(x^n-a^n)f(x)−f(a)=(a0−a0)原创 2021-08-22 15:38:35 · 120 阅读 · 0 评论 -
高斯消元学习笔记
高斯消元高斯消元法(Gauss-Jordan elimination)是求解线性方程组的经典算法,它在当代数学中有着重要的地位和价值,是线性代数课程教学的重要组成部分。高斯消元法除了用于线性方程组求解外,还可以用于行列式计算、求矩阵的逆,以及其他计算机和工程方面。夏建明等人之前提出了应用图形处理器 (GPU) 加速求解线性方程组的高斯消元法,所提出的算法与基于 CPU 的算法相比较取得更快的运算速度。二是提出各种变异高斯消元法以满足特定工作的需要。消元法理论的核心消元法理论的核心主要如下:原创 2021-08-19 17:26:52 · 434 阅读 · 0 评论 -
Lucas 定理学习笔记
Lucas 定理Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数。正常的组合数运算可以通过递推公式求解(详见排列组合),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理。求解方式Lucas 定理内容如下:对于质数 ppp,有(nm) mod p=(⌊n/p⌋⌊m/p⌋)⋅(n mod pm mod p) mod p\binom{n}{m}\bmod p = \binom{\left\lfloor n/p \right\rf原创 2021-08-19 10:13:34 · 343 阅读 · 0 评论 -
线性同余方程和中国剩余定理学习笔记
线性同余方程介绍形如 ax≡c(modb)ax \equiv c \pmod bax≡c(modb) 的方程被称为 线性同余方程(Congruence Equation)。求解方法根据以下两个定理,我们可以求出同余方程 ax≡c(modb)ax \equiv c \pmod bax≡c(modb) 的解。定理 1:方程 ax+by=cax+by=cax+by=c 与方程 ax≡c(modb)ax \equiv c \pmod bax≡c(modb) 是等价的,有整数解的充要条件为 gcd(a,b)原创 2021-08-18 20:46:05 · 475 阅读 · 0 评论 -
乘法逆元学习笔记
模意义下乘法运算的逆元(Modular Multiplicative Inverse),如何使用扩展欧几里德算法(Extended Euclidean algorithm)求解乘法逆元逆元简介如果一个线性同余方程 ax≡1(modb)ax \equiv 1 \pmod bax≡1(modb),则 xxx 称为 a mod ba \bmod bamodb 的逆元,记作 a−1a^{-1}a−1。如何求逆元扩展欧几里得法int extend_gcd(int a, int b, int &x,原创 2021-08-18 15:55:04 · 257 阅读 · 0 评论 -
欧几里得算法和裴蜀定理学习笔记
最大公约数最大公约数即为 Greatest Common Divisor,常缩写为 gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。±1\pm 1±1 是任意一组整数的公约数。一组整数的最大公约数,是指所有公约数里面最大的一个。如果两个数 aaa 和 bbb 满足 gcd(a,b)=1\gcd(a, b) = 1gcd(a,b)=1,我们称 aaa 和 bbb 互质。那么如何求最大公约数呢?我们先考虑两个数的情况。欧几里得算法如果我们已知两个数 aaa 和 bbb,如何求出二原创 2021-08-18 15:19:59 · 157 阅读 · 0 评论 -
类欧几里德算法
类欧几里德算法由洪华敦在 2016 年冬令营营员交流中提出的内容,其本质可以理解为,使用一个类似辗转相除法来做函数求和的过程。引入设f(a,b,c,n)=∑i=0n⌊ai+bc⌋f(a,b,c,n)=\sum_{i=0}^n\left\lfloor \frac{ai+b}{c} \right\rfloorf(a,b,c,n)=i=0∑n⌊cai+b⌋其中 a,b,c,na,b,c,na,b,c,n 是常数。需要一个 O(logn)O(\log n)O(logn) 的算法。这个式子和我们以原创 2021-08-18 11:15:19 · 207 阅读 · 0 评论 -
素数和反素数学习笔记
定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。素数计数函数:小于或等于 xxx 的素数的个数,用 π(x)\pi(x)π(x) 表示。随着 xxx 的增大,有这样的近似结果:π(x)∼xln(x)\pi(x) \sim \frac{x}{\ln(x)}π(x)∼ln(x)x素数判定:暴力做法自然可以枚举从小到大的每个数看是否能整除bool isPrime(a) { if (a < 2) ret原创 2021-08-18 10:03:12 · 385 阅读 · 0 评论 -
欧拉函数笔记
基本定理φ(N)=N∗(1−1p1)∗(1−1p2)∗⋯∗(1−1pn)=N∗p1−1p1∗(p2−1p2)∗⋯∗pn−1pn\begin{aligned}\varphi(N)&=N*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*\dots*(1-\frac{1}{p_n})\\&= N*\frac{p_1-1}{p_1}*(\frac{p_2-1}{p_2})*\dots*\frac{p_n-1}{p_n}\end{aligned}φ(N)=N∗(1原创 2021-08-16 16:45:07 · 190 阅读 · 0 评论 -
喜迎暑假多校联赛第一场 D--欧拉降幂/扩展欧拉函数
理论部分:一般降幂公式使用最后一个。求一个数的欧拉函数值int euler_phi(int n) { int ans = n; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { ans = ans / i * (i - 1); while (n % i == 0) n /= i; } } if (n > 1) ans = ans / n * (n - 1); return ans;}...原创 2021-07-10 21:25:57 · 74 阅读 · 0 评论 -
喜迎暑假多校联赛第一场 B--矩阵快速幂
AcWing 205. 斐波那契在斐波那契数列中,Fib0=0,Fib1=1,Fibn=Fibn−1+Fibn−2(n>1)。给定整数 n,求 Fibnmod10000。输入格式:输入包含多组测试用例。每个测试用例占一行,包含一个整数 n。当输入用例 n=−1 时,表示输入终止,且该用例无需处理。输出格式:每个测试用例输出一个整数表示结果。每个结果占一行。数据范围0≤n≤2×109输入样例:099999999991000000000-1输出样例:034626原创 2021-07-10 19:54:56 · 81 阅读 · 0 评论 -
线段树--区间最大gcd问题
AcWing 246. 区间最大公约数给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一原创 2021-06-25 09:53:34 · 714 阅读 · 0 评论 -
上海理工大学第二届“联想杯”全国程序设计邀请赛 J --数论,线性筛
上海理工大学第二届“联想杯”全国程序设计邀请赛 J JXC&Jesus题目分析可知只需求[l+1,l+n]中每个数的最小质因子p1对应的次数a1,经运算得到的数比原数num少了num/qpow(p1,a1-a1/m)减去即可。#include<bits/stdc++.h>using namespace std;template <typename T> void debug(string s, T x) { cout << s << "原创 2021-06-17 21:18:23 · 114 阅读 · 0 评论 -
Codeforces Round #723 (Div. 2) B. I Hate 1111--数论,dp
定理:a,b互质,则a,b最大不能表示出的数是ab-a-b原创 2021-06-07 11:34:53 · 155 阅读 · 0 评论 -
矩阵快速幂
const ll MAXN = 2;//矩阵的阶struct Matrix { ll m[N][N]; Matrix() { memset(m, 0, sizeof(m)); }};Matrix Multi(Matrix a,Matrix b) {// 矩阵乘法 Matrix ans; for (int i = 0; i < MAXN; ++i) { for (int j = 0; j < MAXN; ++j) { for (in原创 2021-05-05 14:37:46 · 77 阅读 · 0 评论 -
约数个数和,约数之和,约数
约数定义约数:约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数1.求约数vector<ll> get_divisors(ll n){//试除法求n的所有约数 vector<ll> ans; for (ll i = 1; i <= n / i; i++) { if (n % i == 0) { ans.push_back(i); if (i != n / i) ans.p原创 2021-04-29 20:36:48 · 180 阅读 · 0 评论 -
AcWing 197. 阶乘分解--质因数
AcWing 197. 阶乘分解#include<bits/stdc++.h>using namespace std;template <typename T> void debug(string s, T x) { cout << s << "=" << x << "\n"; }typedef long long ll;typedef unsigned long long ull;typedef pair<ll,原创 2021-04-28 22:00:15 · 104 阅读 · 1 评论 -
小圆前辈的暴力枚举--排列与组合
小圆前辈的暴力枚举题意:有一个n * m的矩阵,对于矩阵上的每一个格子,你都可以放置一个棋子在所有放置情况中有多少种情况满足:对于矩阵的每一行且每一列至多只有1个棋子题解:排列组合问题,n,m为两条边,令x=min(n,m),答案为 C(n,0) * A(m,0)+C(n,1) *A(m,1)+…+C(n,x) * A(m,x)相当在棋盘上放0个,1个,2个…x个棋子方案数之和,对于放k个棋子,我们可以理解为从n行中取出k行,从m列中取k行来放棋子,对于第一行的棋子有m种放法,第二行有m原创 2021-04-26 10:15:38 · 194 阅读 · 0 评论 -
素数筛法笔记
线性筛int primes[N], cnt; // primes[]存储所有素数bool st[N]; // st[x]存储x是否被筛掉,0为素数void get_primes(int n){ for (int i = 2; i <= n; i++){ if (!st[i]) primes[cnt++] = i; for (int j = 0; primes[j] <= n / i; j++){ st原创 2021-04-24 21:09:16 · 66 阅读 · 0 评论 -
Pollard_rho定理:求大数的因数个数
原题链接#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <map>using namespace std;typedef long long ll;const int NUM = 10;//运算次数,Miller_Rabin算转载 2021-03-21 14:28:08 · 290 阅读 · 0 评论