数论基础
magnte
这个作者很懒,什么都没留下…
展开
-
快速幂模板 快速幂求逆元
快速幂用来在Ologk 的时间内求出 a ^ k mod p的值。先预处理出a ^ 2 ^ 0,a ^ 2 ^ 1 … a ^ 2 ^ logk的值,再根据k的位运算乘a。代码:int ksm(int a,int k,int p){ int res = 1; while(k) { if(k & 1) res = (ll)res * a % p; k >>= 1; a = (ll)a *.原创 2021-09-10 22:59:05 · 142 阅读 · 0 评论 -
acwing-Hankson的趣味题(筛约数)
Hankson的趣味题题意是给abcd四个数,求有多少个x满足gcd(a,x)==b,lcm(c,x)==d.由于lcm(c,x)==d,所以x一定是d的约数,所以可以求出d的所有约数再判断是否符合条件。第一种:试除法求约数,会超时。第二种:筛出1 - sqrt d 的所有质数,再爆搜出d的所有约数判断是否符合条件。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pai原创 2021-09-09 09:05:34 · 125 阅读 · 0 评论 -
acwing-质数距离(筛选区间质数)
质数距离由于线性筛只能从头开始筛起,所以对于比较数值比较大的一个区间,采用线性筛无法在较好的时间内筛出结果。可以筛出 1 - sqrt n 中的所有质数,对于每个质数,将他在区间内的倍数标记,所有未被标记的则是区间内所有质数。关键:区间左端点上取整,右端点下取整。区间内的数过大,数组存不了可以减去区间左端点。代码:#include<bits/stdc++.h>using namespace std;const int N = 45000;int prime[N],原创 2021-09-09 08:54:48 · 126 阅读 · 0 评论 -
最大公约数Ⅱ(欧拉函数)
最大公约数求GCD(x,y) 为素数的数对 (x,y) 有多少对。关键:将x y 拆成 a * d,b * d,(d为素数)、前缀和优化、phi[1]的另外处理.题解转自秦大佬题解。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 10000010;ll prime[N],phi[N],n,idx,sum[N],ans;bool st[N];void原创 2021-08-26 21:51:57 · 160 阅读 · 0 评论 -
欧拉函数
欧拉函数:f(n):1 ~ n 中与 n 互质的数的个数。互质:两个数的最大公约数为1时,两个数互质。分解质因数公式:N = a1 ^ p1* a2 ^ p2 * … * ak ^ pk欧拉函数公式:f(N): N * (1 - 1 / p1)(1 - 1 / p2)…(1 - 1 / pk)证明:(容斥原理)1、1 ~ n 去掉 p1,p2,…pk的倍数(不可能互质)2、加上所有pi * pj的倍数3、减去所有pi * pj * pk倍数,以此类推,得到公式代码:#include.原创 2021-08-26 17:40:10 · 1014 阅读 · 0 评论 -
acwing - 轻拍牛头
今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.贝茜让 N 头奶牛(编号 1 到 N )坐成一个圈。除了 1 号与 N 号奶牛外, i 号奶牛与 i−1 号和 i+1 号奶牛相邻, N 号奶牛与 1 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张纸条中包含一个 1 到 1000000 之间的数字。接着每一头奶牛 i 从桶中取出一张纸条,纸条上的数字用 Ai 表示。所有奶牛都选取完毕后,每头奶牛轮流走上一圈,当走到一头奶牛身旁时,如果原创 2021-08-26 15:37:53 · 251 阅读 · 0 评论 -
acwing-樱花(阶乘质因数分解)
题意:求不定方程1 / x+1 / y = 1 / n! 的正整数解的个数.转化为求 (n!) ^ 2 的约数个数推导过程(大佬讲的很清晰!)总结:在对于求多少个整数对(x,y)满足某方程式的问题时,可以先观察出 x、y与未知数的关系,然后转化成一个用 一个 x 表示的 y 的表达式,根据 y 的约束条件得到(x,y)的匹配数量。代码:#include<bits/stdc++.h>using namespace std;const int N = 1000010,m.原创 2021-08-24 17:13:24 · 163 阅读 · 0 评论 -
acwing-反素数
反素数反素数:对于x,所有比 x 小的正整数的约数个数都小于 x 的约数个数,那么 x 为反素数,题目求 1 - n 中的最大反素数。几个关键点:求1 - n 中拥有最多约数个数中最小的那一个。约数最多好理解,不是最多肯定不是最大反素数,而如果几个数都拥有这相同的最大约数个数,只有最小的那个数才是反素数,所以要最小。分解质因数的各质数之和一定小于等于31个。即使全分解成2,质数也会小于等于31。可分解的质数一定是从2开始连续的,且指数呈下降趋势。如果指数不连续或者不从2开始是可以调原创 2021-08-24 12:20:54 · 126 阅读 · 0 评论 -
GCD模板(求最大公约数)
int gcd(int a,int b){ return b ? gcd(b,a % b) : a;}也叫欧几里得算法或辗转相除法。证明:根据模板需要证明gcd(a,b) = gcd(b,a % b)有d是a的约数,d是b的约数,d是ax + by的约数。又有a mod b = a - (a / b(下取整) * b),设 c = a / b(下取整)所以需要证明:gcd(a,b) = gcd(b,a - (c * b))利用充分必要性证明:左到右:根据第一条定理,只要原创 2021-08-24 10:57:39 · 1606 阅读 · 0 评论 -
约数个数 约数之和
分别求n个数的乘积的所有约数个数以及和。有分解质因数公式,将每个数都分解质因数,用一个 map 来存每个质数的底数和指数。p1 的质数可以从零取到 a1, p2 可以取到 a2,以此类推,每个约数由 p1 到 pk 各选一个质数相乘得来,所以约数个数等于 (a1 + 1) * (a2 + 1) …(ak + 1).将约数之和的公式展开可以发现就是所有约数相加。求(p1 ^ 0 + p1 ^ 1 + p1 ^ 2 + … + p1 ^ a)的方法:设 t = 1,执行一次 t = p * .原创 2021-08-24 10:11:08 · 458 阅读 · 0 评论 -
试除法求约数
记得判断 x / i == i 的时候两个约数相同只要记录一个#include<bits/stdc++.h>using namespace std;const int N = 100010;void fun(int x){ int a[N],idx = 0; for(int i = 1; i <= x / i; i ++ ) { if(x % i == 0) { a[idx ++ ] = i;.原创 2021-08-24 09:33:42 · 67 阅读 · 0 评论 -
三种筛质数方法
给定一个正整数 n ,请你求出 1∼n 中质数的个数。输入格式共一行,包含整数 n 。输出格式共一行,包含一个整数,表示 1∼n 中质数的个数。数据范围1≤n≤106输入样例:8输出样例:4一、朴素筛法对于每个数,筛掉他的所有倍数复杂度:2要筛n / 2 次,3要筛n / 3次,所以一共要筛n / 2 + n / 3 + …n / n,也就是 n * (1 / 2 + 1 / 3 + … + 1 / n)次,后面求和是调和级数,当 n 足够大时,等于lnn + c,原创 2021-08-19 17:01:04 · 4872 阅读 · 2 评论 -
试除法分解质因数
给定 n 个正整数 ai ,判定每个数是否是质数。输入格式第一行包含整数 n 。接下来 n 行,每行包含一个正整数 ai 。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100 ,1≤ai≤231−1输入样例:226输出样例:YesNo#include<bits/stdc++.h>//最差情况sqrt(n),最好情况(比如2的n次方)为lognusing原创 2021-08-19 16:39:59 · 68 阅读 · 0 评论 -
试除法判断质数
给定 n 个正整数 ai ,判定每个数是否是质数。输入格式第一行包含整数 n 。接下来 n 行,每行包含一个正整数 ai 。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100 ,1≤ai≤231−1输入样例:226输出样例:YesNo对要判断的数n,i 枚举2到sqrt(n),如果存在 n % i == 0,说明有因子不是质数,否则是质数。注意可以用 for(i原创 2021-08-19 16:34:51 · 150 阅读 · 0 评论 -
博弈论之SG函数
惯例先引入一些概念:(概念来自于网络)有向图游戏:给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。Mex运算: 设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,即: mex(S) = min{x},x属原创 2021-07-26 09:34:48 · 644 阅读 · 1 评论 -
博弈论基础
先引入几个概念:公平组合游戏(IGC):1)有两个玩家,游戏规则对两个玩家公平(2)游戏状态有限,能走的步数也是有限的(3)轮流走,当一个玩家不能走时游戏结束(4)游戏的局势不能区分玩家的身份,例如黑白棋就是不行的特征:给定初始局势,指定先手玩家,如果双方都采取最优策略,那么获胜者已经确定了,也就是说ICG问题存在必胜策略。先手必胜:指当轮到自己走时,下一步能够走到必败的局面。先手必败:指当轮到自己走时,下一步无论如何都无法走到必败的局面。Nim游戏给定 n 堆石子,两位玩家轮原创 2021-07-26 00:00:18 · 220 阅读 · 0 评论 -
容斥原理模板
容斥原理容斥原理:n个集合S = 1个集合 - 两个集合交集 + 三个集合交集 + … + (-1) ^ n * n个集合交集。总共有(2 ^ n) - 1项。用一个韦恩图表示给ABC面积,求图形总占面积S = A + B + C - AB - AC - BC + ABC当给四个集合时,S = A + B + C + D - AB - AC - AD -BC - BD - CD + ABC + ABD + ACD + BCD - ABCD;类推到n个集合:S = 1个集合 - 两个集原创 2021-07-25 16:16:09 · 300 阅读 · 0 评论