![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
这是ACM—ICPC算法的数论专题。
极地星辰
这个作者很懒,什么都没留下…
展开
-
Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题
【代码】Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题。原创 2023-08-13 01:04:46 · 561 阅读 · 0 评论 -
Codeforces Round #663 (Div. 2) C - Cyclic Permutations
Codeforces Round #663 (Div. 2) C - Cyclic Permutations题目链接:https://codeforces.com/contest/1391/problem/C满足条件的排列数等于总排列数-不满足条件的排列数。而不满足条件的排列数通过找规律:如n = 4时:不满足条件的排列有:1234432124311342342114322341一共八个,但可以分为4组。一位第1,2,第3,4,第5,6,第7,8个排列,分别是reverse的。那么原创 2020-08-10 10:46:42 · 186 阅读 · 0 评论 -
欧拉定理与扩展欧拉定理
欧拉定理:若gcd(a,p)=1,则a^φ§≡1(mod p)欧拉定理特例:费马小定理:若p是质数,则对于任意整数a,有a^p≡a(mod p)。扩展欧拉定理:欧拉函数:对于一个正整数n,小于等于n且和n互质的正整数(包括1)的个数,记作φ(n) 。通式:φ(n)=n*(1-1/p1) * (1-1/p2) * (1-1/p3) * (1-1/p4) * …… * (1-1/pn), 其中p1, p2……pn为n的所有质因数,n是不为0的整数。记 φ(1)=1(唯一和1互质的数就是1本身)。欧原创 2020-07-19 12:30:49 · 444 阅读 · 2 评论 -
快速幂加指数分解
例:a ^123456789%mod = a ^(1e8 * 1 )%mod * a ^(1e7 * 2 )%mod * a ^(1e6 * 3 )%mod * a ^(1e5 * 4 )%mod * a ^(1e4 * 5 )%mod * a ^(1e 3 * 6 )%mod * a ^(1e2 * 7 )%mod * a ^(1e1 * 8 )%mod * a ^(1e0 * 9 )%mod若a的指数极大则可用字符串存储:由此核心代码如下:快速幂:int mod;long long原创 2020-07-19 11:41:13 · 218 阅读 · 0 评论 -
裴蜀定理与扩展欧几里德算法
裴蜀定理又称贝祖定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。裴蜀定理的推广:方程ax+by+cz+…+nm=f(其中a,b,c…n,f为整数)有解的充要条件是f为gcd(a,b,c,…,n)的整数倍。裴蜀定理的应用:给定一个序列{an},寻找一个整数序列{bn}使得a1b1+a2b2+…+an*bn值最小(要求最小值为正数),求这个最小值。解:根据裴蜀定理的推广,原式最小值即为gcd(a1,a2…an)。扩展欧几里德算法是为求解裴蜀定理服务的。即通原创 2020-07-19 10:26:07 · 409 阅读 · 0 评论 -
洛谷P2485 [SDOI2011]计算器
case 1 :快速幂取模 ;case 2:exgcd求乘法逆元,注意y%p的逆元存在条件为gcd(y,p) = 1 ,即y 与 p 互质;case 3:扩展BSGS 。源码:#include <iostream>#include <algorithm>#include <map>#include <cmath>using namespace std;long long t,k;long long y,z,p;long long po原创 2020-07-14 11:37:41 · 191 阅读 · 0 评论 -
BSGS
给定一个质数 p,以及一个整数 b,一个整数 n,现在要求你计算一个最小的 x,满足 y ^x ≡n(modp)。思路 :设 x = am-b, 那么原式可化为 : y ^am ≡ny ^b(modp) 。那么 0 <= b <= m-1 , 1 <= a <= m+1 。复杂度为 max(m,p/m), 所以当 m = sqrt§ 时复杂度最低。所以我们令 m = sqrt§ 。#include <iostream>#include <algorithm原创 2020-07-14 10:30:39 · 217 阅读 · 0 评论 -
蒜头君的数轴:正反gcd
题目:蒜头君的数轴今天蒜头君拿到了一个数轴,上边有 nnn 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同。蒜头君想知道,他最少需要加多少个点使这个数轴变优美。输入格式输入第一行为一个整数 n(1≤n≤105)n(1 \leq n \leq 10^5)n(1≤n≤105),表示数轴上的点数。第二行为 nnn 个不重复的整数 x1,x2,…,xn(−109≤xi≤109)x_1,x_2,…,x_n(-10^9 \le原创 2020-07-09 13:54:47 · 217 阅读 · 0 评论 -
求数组所有元素的最大公因数
利用优先级队列。int get_gcd(){ priority_queue<int, vector<int>, greater<int>> q; for(int i = 0;i<n;i++){ q.push(b[i]); } int maxl = 1; while(1){ int flag = 0; priority_queue<int, vector<int>, greater<int> > p; w原创 2020-07-09 13:27:59 · 1588 阅读 · 0 评论 -
线性求乘法逆元
用于求一连串数字对于一个 mod p的逆元。如果只是求一个数的逆元建议使用费马小定理或扩展欧几里德定理。线性算法求逆元的原理:已知, (1/1)≡1 (mod p) , 设 p=k∗i+r,(1<r<i<p) , 即k 是 p/i的商 , r 是 p/i 的余数。即 k∗i+r≡0 (mod p)。 ≡左右两边同时乘上(1/i)*(1/r) , 即 k * (1/r) + (1/i) ≡0 (modp) 。移项可得 , (1/i) ≡ - k * (1/r) (mod p)原创 2020-07-07 09:47:31 · 1433 阅读 · 2 评论 -
快速判断1e4以内正整数是否为素数
理论基础:一个合数一定有一个素因子 <= sqrt(n) 。证明:一个合数n肯定有素因子,并且在[2,n-1]上。若有一个素因子x大于等于sqrt(n),就必然有一个因子n/x小于等于sqrt(n),而n/x必有一个素因子小于等于sqrt(n) ,而n/x的素因子也是n的素因子。已知:n <= 1e4。代码如下:#include <iostream>#include <algorithm>#include <cmath>using namesp原创 2020-07-03 22:12:35 · 240 阅读 · 0 评论 -
素数与素数筛
普通素数判断#include <iostream>#include <algorithm>#include <cmath>using namespace std;int main(){ int n; cin >> n; if(n == 2){ cout << "Yes" << endl; return 0; } if(n%2 == 0||n <= 1){ cout << "NO" &原创 2020-06-30 10:57:30 · 96 阅读 · 0 评论