数论1.01

欧几里得(GCD,exGCD)

1.两个数除以最大公约数的结果互为质数

2.欧几里得算法(辗转相除法)求最大公约数

设a,b,c是不全为0的整数,满足1存在整数q, a=bq+c,,那么(a,b)=(b,c)

其中c就等a%b

时间复杂度是log的

如果a*m=b*n(a|b*n==m)并且a和b互质,那么a就能整除b*n(其实是a能整除n);

0和任何一个数的最大公约数等于该数本身

至于为什么是下面这个代码咋这么求的:

我以我以及的理解写一遍

第一次:ax+by=gcd;

第二次:bx+(a%b)y=gcd

而a%b=a-a/b*b;

所以b*x+(a-a/b*b)*y=gcd;

bx+ay-a/b*b*y=gcd

ay+b*(x-a/b*y)=gcd;

两个红色字体相比不难看出对应的x,y是谁(从后往前推)

x=y, y=x-a/b*y

如果ax+by=gcd

b=0,那么gcd=a,所以x=1,y=0;

cpp 复制代码
#include<iostream>
#include<cstdio>
#include<cmath>
 
using namespace std;
 
int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
{
    if(b==0)
    {
        x=1;y=0;
        return a;  //到达递归边界开始向上一层返回
    }
    int r=exgcd(b,a%b,x,y);
    int temp=y;    //把x y变成上一层的
    y=x-(a/b)*y;
    x=temp;
    return r;     //得到a b的最大公因数
}

整数分解:

埃氏筛:O(nlog(log(n)))

用质数把质数的倍数筛掉

欧拉筛:O(n)

每个合数只需要被其最小的质因子筛掉

cpp 复制代码
const int maxn = 101;   // 表长
int prime[maxn], pNum = 0;    // prime记录素数,pNum记录素数个数 
bool p[maxn] = {false};        // p记录当前数是否被筛去

void eulerSieve(int n)    // 查找记录2-n的素数
{
	for (int i = 2; i <= n; i++)
	{
		if (p[i] == false)  // 如果未被筛过,则为素数
			prime[pNum++] = i;
		for (j = 0; j < pNum; j++)
		{
			if (i * prime[j] > n)      // 当要标记的合数超出范围时跳出
				break;
			p[i * prime[j]] = true;     // 将已经记录的素数的倍数进行标记
			if (i % prime[j] == 0)      //关键步骤
				break;
		}
	}
}

详细解释看这个:欧拉筛详解-CSDN博客挺详细的。

相关推荐
动词ing22 分钟前
【题目练习】算法 组合总和||
算法
longlongzihan27 分钟前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源39 分钟前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1011 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0111 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯2 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水2 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB2 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
Shaoshing2 小时前
BHU 润石工作室 251019自建赛题解
算法
玩AI的奶茶2 小时前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁