数论基础
数论
SumFunction
这个作者很懒,什么都没留下…
展开
-
扩展欧几里得算法
裴蜀定理1、若有整数a,b 则一定存在整数x,y使得ax+by=gcd(a,b)2、存在无限多整数x,y 使得ax+by=d成立 其中d是gcd(a,b)倍数 这条定理可以由上面推得3、若a、b互质 则使得ax+by=c满足不定方程成立的c有无限多个因为gcd(a,b)=1 由推论2可得推论3成立4、若限制上面的x,y>0 则会有有限多个的c使得ax+by=c不成立5、若ab不互质 则使得ax+by=c会有无限多个c使得该不定方程不成立因为只有c满足gcd(a,b)的倍数时才满足不定方程原创 2021-03-22 00:39:29 · 160 阅读 · 0 评论 -
一行代码实现最大公约数模板
数论有如下性质c能整除a也能整除b则c能整除x1a+x2b x1和x2是前面系数现在证明 (a,b)最大公约数=(b,a%b)最大公约数证明如下a%b = a-cb c=a整除b用gcd表示两个数最大公数则gcd(a,b)=gcd(b,a-cb)已知(a,b)中每个约数都能被a,b整数 则由数论性值 可以推出每个约数也能被a-cb整除(b,a-cb)中每个约数能被b,a-cb整数 那也能被a-cb+c*b整除 由数论性值得到则可以推左边每个约数=右边每个约数 所以(a,b)最大公约数=(原创 2021-03-14 23:29:06 · 252 阅读 · 0 评论 -
并查集1
并查集 最基本作用:判断两个元素是否在同一个集合中基本原理:每个集合都是用一棵树表示 集合用这个树的祖宗节点表示 用一个parent数组来存储每个结点的父亲节点 祖宗节点的父亲节点是自己问题1:判断树根 也就是if(parent[x]==x)问题2:求解元素的集合编号 while(parent[x] != x) x = parent[x];问题3:合并两个集合操作 设px是x元素的集合编号 py是y元素的集合编号 则只需要将parent[px] = py即可 也就是将x元素的集合祖宗的父亲认为y元素原创 2021-03-13 19:56:06 · 80 阅读 · 0 评论 -
分解质因数
题目描述一个合数一定可以被多个质数相乘表示得到例如 100可以被分解为100=225*5算法流程 时间复杂度O(sqrt(n))循环遍历i到sqrt(n) 如果当前i能被当前n整除 说明当前i是当前n的因子代码如下:#include<iostream>using namespace std;const int N = 10010;int res[N];void divid(int n){//分解质因数 for(int i = 2;i <= n/i;i++){//输出原创 2021-03-13 19:12:44 · 542 阅读 · 0 评论 -
求约数
求一个数n的所有约数例如 6的所有约数为 1,2,3,6算法思路暴力枚举 不过只需要枚举到i<=n/i 也就是sqrt(n)就行了#include<iostream>#include<vector>#include<algorithm>using namespace std;vector<int> res;void divid(int n){ for(int i = 1;i <= n/i;i++){ if(n % i ==原创 2021-03-13 17:10:31 · 314 阅读 · 0 评论 -
快速幂
给定n组ai,bi,pi,对于每组数据,求出abii mod pi的值。输入格式第一行包含整数n。接下来n行,每行包含三个整数ai,bi,pi。输出格式对于每组数据,输出一个结果,表示abii mod pi的值。每个结果占一行。数据范围1≤n≤100000,1≤ai,bi,pi≤2∗109输入样例:23 2 54 3 9输出样例:41快速幂算法思路该算法能在log(k)时间复杂度内求解a^k%p的结果将ak 分解为a^(k)2进制例如 求解45 的结果5的二进制表示原创 2021-03-12 23:06:40 · 102 阅读 · 0 评论 -
筛质数
题目描述求出1-n中所有的质数朴素筛法 时间复杂度O(nlogn)创建一个primes数组 下标表示这个数是某个数的倍数从1-n开始枚举1、判断第i个数是不是前面1~i-1个数的倍数 如果是 则不是素数 反之则是素数2、标记i的倍数进vis数组直到n代码如下:#include<iostream>using namespace std;const int N = 500;int vis[N];int primes[N];void get_primes(int n){ i原创 2021-03-13 16:48:53 · 89 阅读 · 0 评论