【算法】初等数论
初等数论
模
取余,遵循尽可能让商向0靠近的原则,结果的正负和左操作数相同
取模,遵循尽可能让商向负无穷靠近的原则,结果的正负和右操作数相同
7/(-3)=-2.3,产生了两个商-2和-3,取余语言中取-2,导致余数为1;取模语言中取-3,导致余数为-2
java中
%是取余
幂
1、暴力幂
思想:直接将a连续乘以b遍
时间复杂度:O(n)
空间复杂度:O(1)
// 求 a^bpublic long pow(int a, int b){long ans = 1;for (int i = 0; i < b; i++) {ans *= a;}return ans;}
2、快速幂
思想:利用幂的2进制形式来加速运算。
时间复杂度:O(log₂N)
空间复杂度:O(1)
// 求 a^bpublic long pow(int a, int b){long ans = 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans *= a;}// 将底数变为原底数的二次方a *= a;// 抛弃幂二进制形式的最后一位b >>= 1;}return ans;}
例子:
3 5 = 3 101 = 3 1 ∗ 2 3 + 0 ∗ 2 2 + 1 ∗ 2 0 = 3 1 ∗ 2 3 ∗ 3 0 ∗ 2 2 ∗ 3 1 ∗ 2 0 3^{5}=3^{101}=3^{1*2^{3}+0*2^{2}+1*2^{0}}=3^{1*2^{3}}*3^{0*2^{2}}*3^{1*2^{0}} 35=3101=31∗23+0∗22+1∗20=31∗23∗30∗22∗31∗20
3、Math类
// 求 a^b
// java.lang.Math
// double pow(double a, double b)
Math.pow(a, b)
可以支持浮点数的幂
补充
结果%c
原理:多个数的积%c,等于下列操作和的结果
- 每个乘项
%c - 最终积
%c
// 求 a^b%cpublic long pow(int a, int b, int c){long ans = 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans = (ans*a)%c;}// 将底数变为原底数的二次方a = (a*a)%c;// 抛弃幂二进制形式的最后一位b >>= 1;}return ans%c;}
对数
1、Math类
//java.lang.Math
double log(double a) //以e为底
double log10(double a) //以10为底Math.log(n);
Math.log10(n);
可以求浮点数的对数
2、朴素
public static int logN(int base, int n) {int power = 0;while (n / base > 0) {n = n / base;power++;}return power;}//log2public int log2(int n) {int power = 0;while ((n = n >> 1) > 0) {power++;}return power;}
矩阵
1、单位矩阵
单位矩阵的对角线上的元素全为1,其他的元素全为0
public int[][] unit(int n){int[][] res=new int[n][n];for(int i=0;i<n;i++){res[i][i]=1;}return res;}
2、乘法
public int[][] multiplyMatrix(int x1[][],int x2[][]){//第一个矩阵的列必须等于第二个矩阵的行if(x1[0].length!=x2.length){return;}int lineLength=x1.length; //第一个矩阵的行int listLength=x2[0].length;//第二个矩阵的列int[][] multiply=new int[lineLength][listLength];//相乘的结果矩阵for(int i=0;i<lineLength;i++){for(int j=0;j<listLength;j++){for(int k=0;k<x1[0].length;k++){multiply[i][j]+=x1[i][k]*x2[k][j];}}}return multiply;}
矩阵
%c等于矩阵上的每一个元素都%c
3、快速幂
类似于整数的快速幂,不同的是1的表示(矩阵中为单位矩阵),以及乘法的定义
// 求 a^bpublic int[][] pow(int[][] A, int b){int[][] ans = unit(A.length);// 不断取幂的二进制形式中的最后一位并且将b不断右移(将b最后一位抛弃),直到幂最后变为0while(b > 0){// 当前幂的最后一位为1,表明需要将该结果添加到最终的结果中(由于是幂中的+,实际上操作为乘法)if((b & 1) == 1){ans = multiplyMatrix(ans,a);}// 将底数变为原底数的二次方a = multiplyMatrix(a,a);// 抛弃幂二进制形式的最后一位b >>= 1;}return ans;}
素数(质数)
质数:是指在大于1的整数中,除了1和它本身以外不再有其他因数的自然数。
合数:是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
1既不属于质数也不属于合数。最小的合数是4,最小的质数是2
1、朴素
boolean isPrime(int n){for(int i=2;i*i<=n;i++){if(n%i==0){return false;}}return true;
}
2、埃氏筛法
//埃氏筛选法public void eratosthenes(int n) {boolean[] isPrime = new boolean[n+1];//false代表是素数,true代表的是合数for (int i = 0; i <= n; i++) {if(i<2){isPrime[i]=true;continue;}//如果是素数if (!isPrime[i]) {//将该素数的所有倍数都标记为合数for (int j = 2 * i; j < n; j += i) {isPrime[j] = true;}}}}
埃拉托斯特尼筛法(简称埃氏筛或爱氏筛):要得到自然数n以内的全部素数,必须把不大于 根号n 的所有素数的倍数剔除,剩下的就是素数。
时间复杂度:O(nloglogn)
不足之处:6 在 indexI = 2 时被标记,而在 indexI = 3 时,又被标记了一次。存在重复标记,有优化空间
3、欧拉筛
欧拉筛是对埃氏筛的改进,避免重筛,提高效率
//欧拉筛选法public void euler(int n) {//建立一个bool类型的数组,以下标为要判断的数字 以该下标的值为素数的标志//若i是素数 则 isPrime[i]=falseboolean[] isPrime = new boolean[n+1];isPrime[0] = isPrime[1] = true;//数字0和1都不是素数,所以赋trueint[] Prime = new int[n+1];//存放素数的数组int t = 0;Prime[t++] = 2;//把2放进素数表for (int i = 2; i <= n; i++) {if (!isPrime[i])//若当前数是素数Prime[t++] = i;//则存入素数数组// 每一个数都去乘以当前素数表里面已有的数,如果 indexI 是合数,且 indexI % primeList[indexJ] == 0,那么它只能乘以第一个素数 2for (int j = 0; j < t && Prime[j] * i <= n; j++) {isPrime[i * Prime[j]] = true;// 保证了每个合数只会被它的最小素因子筛掉,避免重筛,使得程序更有效率if (i % Prime[j] == 0)break;}}}
欧拉筛法:保证每个合数只会被它的最小质因数筛掉,时间复杂度降低到O(n)。
每一个数都去乘以当前素数表里面 小于等于最小素因子的数
最大公因数(gcd)
最大公约数(Greatest Common Divisor)
1、辗转相除法(欧几里得)
思想:两个正整数a和b(a > b),它们的最大公约数gcd等于a除以b的余数r和b之间的最大公约数。辗转相除法的算法流程可以如下:
- 计算a与b的余数r。
- 如果r为0,则返回gcd = b。否则,转到步骤3。
- 使用b的值更新a的值,使用余数r更新b的值,转到步骤1。
int gcd(int x, int y) {return x == 0 ? y : gcd(y % x, x);
}int gcd(int a, int b){if (b == 0)return a;elsereturn gcd(b, a%b);
}int gcd(int a, int b){int temp;while(b!=0){temp=a%b;a=b;b=temp;}return a;
}
根本无需判断a和b的大小,当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来
2、更相减损术
思想:两个正整数a和b(a > b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。依次递归下去,直到两个数相等。这相等两个数的值就是所求最大公约数。
int gcd(int x, int y) {if (x==y)return x;else if (x>y)return gcd(x-y,y);else return gcd(y-x,x);
}
更相减损法和辗转相除法的思想较为接近,不同的是辗转相除法迭代更快,而更相减损法迭代慢。但后者使用的是减法,前者使用的是求余,前者损耗较低。在两数相差较大时避免使用更相减损法,而在大数是避免使用辗转相除法。
最小公倍数(lcm)
1、加穷举法
将大数依次乘N(N为从1开始的自然数),对得到的数判断其是否整除小数。
2、乘穷举法
将大数依次加1,对得到的数判断其是否可整除两数。
3、最大公因数法(最优)
l c m ( a , b ) = ∣ a ⋅ b ∣ g c d ( a , b ) lcm(a,b)=\frac{∣a⋅b∣}{gcd(a,b)} lcm(a,b)=gcd(a,b)∣a⋅b∣
int lcm(int a, int b) {return a * b / gcd(a, b);
}
相关文章:
【算法】初等数论
初等数论 模 取余,遵循尽可能让商向0靠近的原则,结果的正负和左操作数相同 取模,遵循尽可能让商向负无穷靠近的原则,结果的正负和右操作数相同 7/(-3)-2.3,产生了两个商-2和-3,取…...
Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
前言 在生成式AI技术蓬勃发展的今天,大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表,DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态,正在成为构建本土化AI应用的首选平台。 本文将以S…...
Spring事务原理 二
在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…...
JVM预热
阿里电商平台每年的各种大促活动,对于Java技术来说,其中重要一个操作环节就是预热操作。 目录 预热是什么?为什么要预热? java 程序不预热和预热的调用对比 预热是什么? 预热是指,在 JVM 启动后࿰…...
基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强,医院就诊量逐年增加。传统的现场…...
DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发
Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…...
easelog(1)基础C++日志功能实现
EaseLog(1)基础C日志功能实现 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 注:本简易日志组件代码实现参考了Google …...
epoll_event的概念和使用案例
epoll_event 是 Linux 下 epoll I/O 多路复用机制的核心数据结构,用于描述文件描述符(File Descriptor, FD)上发生的事件及其关联的用户数据。通过 epoll,可以高效地监控多个文件描述符的状态变化(如可读、可写、错误等…...
Leetcode2506:统计相似字符串对的数目
题目描述: 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。 例如,"abca" 和 "cba" 相似,因为它们都由字符 a、b、c 组成。然而,"…...
蓝桥月赛 之 26场
文章目录 好汤圆灯笼猜谜元宵分配摆放汤圆 好汤圆 好汤圆 思路分析:由于2025能够被15整除,所以我们直接输出对应的答案即可 import os import sys# 请在此输入您的代码print(2025//15)灯笼猜谜 灯笼猜谜 思路分析:首先呢,我就考…...
机器学习面试八股文——决战金三银四
大家好,这里是好评笔记,公主 号:Goodnote,专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…...
umi: valtio的使用
一、基本用法 import { proxy, useSnapshot } from umijs/max;// 1、定义数据 const state proxy({ count: 33 });export default () > {// 2、使用数据const snap useSnapshot(state);function increaseCount() {state.count 1;}return (<><h1>{snap.count}…...
区块链相关方法-波特五力分析模型
一、定义:波特五力分析模型(Porters Five Forces Framework)是迈克尔・波特(Michael Porter)于 1979 年提出的一种用于分析行业竞争态势的工具。它通过考察五种力量的相互作用来评估一个行业的吸引力和竞争环境,这五种…...
纷析云开源版- Vue2-增加字典存储到localStorage
main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...
HTML项目一键打包工具:HTML2EXE 最新版
HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件,直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义(支持…...
Windows 中的启动项如何打开?管理电脑启动程序的三种方法
在日常使用电脑时,我们经常会发现一些应用程序在开机时自动启动,这不仅会拖慢系统的启动速度,还可能占用不必要的系统资源。幸运的是,通过几个简单的步骤,你可以轻松管理这些开机自启的应用程序。接下来,我…...
在 JavaScript 中接入 Facebook 事件
在 JavaScript 中接入 Facebook 事件 本文档介绍了如何在 JavaScript 中集成 Facebook Pixel 事件,用于跟踪网站的用户行为并提高广告效果。 1. 安装并初始化 Facebook Pixel 在开始接入事件之前,首先需要在你的网页中初始化 Facebook Pixel。Faceboo…...
如何在cursor上使用 deepseek 模型
引言 Cursor 虽提供免费试用,但试用时间有限,且后续使用可能会面临速度限制。不过,用户可以使用自己的 API key 来继续使用。值得一提的是,deepseek 模型使用成本极为低廉,能为使用者带来更多灵活性与经济性。基于此&…...
mysql的字符集和比较规则
mysql的字符集和比较规则 一、字符集(Character Set)二、比较规则(Collation)三、客户端与服务器的字符集转换四、注意事项总结 深度解读mysql是怎样运行的 MySQL的字符集和比较规则是其处理字符串存储、传输及比较的核心机制&…...
什么是LoRA微调
LoRA是大模型微调方法的一种,它的特点是只在模型的 部分权重(如 QKV 矩阵) 上 添加可训练参数 通过 低秩矩阵(AB) 来优化参数更新 优点: 极大降低显存消耗(deepseek 7B 只需 10GB) 适…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
