【算法】数论——蓝桥杯笔记、最大公约数、欧拉函数模版、线性筛法求欧拉函数、快速幂 a^k%p、扩展欧几里得算法

文章目录

  • 蓝桥杯
    • * 最大公约数
    • 欧拉函数模版
    • * 线性筛法 求欧拉函数
    • * 快速幂 a^k%p
    • 扩展欧几里得算法

蓝桥杯

* 最大公约数

  两个整数的最大公约数等于其中较小的那个数和两数的差的最大公约数。通过不断地用较小的数替换较大的数,并用两数的差替换较小的数,最终会得到最大公约数。

  例如,计算 gcd(48, 18) 的过程如下:

  gcd(48, 18)
  gcd(18, 48 % 18) = gcd(18, 12)
  gcd(12, 18 % 12) = gcd(12, 6)
  gcd(6, 12 % 6) = gcd(6, 0)

  当 b 为零时,算法停止,返回 a(在这里是6),这是 48 和 18 的最大公约数。

int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}

  
在这里插入图片描述

  对于一些比较难以理解或者自己尝试书写有困难的算法,我们可以理解它的一些简单的例子并且尝试记下来,对于我们直接使用提高做题效率有很大的帮助。

#include <iostream>
using namespace std;int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}int main()
{int ret=0;for(int i=1;i<=3030;i++){if(gcd(i,2020)==i&&gcd(i,3030)==i){ret++;}}cout<<ret;return 0;
}

  
在这里插入图片描述

#include <iostream>
using namespace std;int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}int main()
{int n=0;cin>>n;int a=0,b=0;while(n--){cin>>a>>b;cout<<gcd(a,b)<<endl;}return 0;
}

  
在这里插入图片描述

#include <iostream>
using namespace std;int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}int main()
{int x=0,y=0;cin>>x>>y;int ret=0;long long xy=x*y;for(int p=x;p<=y;p++){for(int q=x;q<=y;q++){if(q*p==xy&&gcd(q,p)==x){ret++;}}}cout<<ret<<endl;return 0;
}

            

欧拉函数模版

  欧拉函数是计算小于n的正整数中与n互质的数的数目。

// 欧拉函数模版
#include <iostream>
using namespace std;
int main()
{int n;cin >> n;while (n--){int a;cin >> a;int res = a;for (int i = 2; i <= a / i; i++){if (a % i == 0){res = res / i * (i - 1);while (a % i == 0) a /= i;}}if (a > 1) res = res / a * (a - 1);cout << res << endl;}return 0;
}

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{int n;cin>>n;while(n--){int a;cin>>a;int res=a;for(int i=2;i<=a/i;i++){if(a%i==0){res=res/i*(i-1);while(a%i==0) a/=i;}}if(a>1) res=res/a*(a-1);cout<<res<<endl;}return 0;
}

  

* 线性筛法 求欧拉函数

  欧拉函数计算小于或等于某个数 n 的所有正整数的欧拉函数值之和的。 欧拉函数,记作 φ(n),表示小于 n 且与 n 互质的正整数的个数。

  get_eulers 函数是实现欧拉函数计算的核心部分。它首先初始化 phi[1] = 1,然后遍历从 2 到 n 的所有整数。对于每个整数 i,如果 i 是质数(即 st[i] 为假),则将其添加到 primes 数组中,并设置 phi[i] = i - 1,因为质数的欧拉函数值就是它自身减一

  接着,对于每个质数 primes[j],代码会计算 primes[j] * i 的欧拉函数值。这里使用了线性筛法的思想,避免了重复计算。如果 i 能够被 primes[j] 整除,那么 primes[j] * i 的欧拉函数值就是 phi[i] * primes[j],并且内层循环会提前结束(因为 primes[j] 已经是 primes[j] * i 的一个质因子,无需继续筛选)。否则,primes[j] 是 primes[j] * i 的一个新质因子,所以 primes[j] * i 的欧拉函数值就是 phi[i] * (primes[j] - 1)。

const int N = 1000010;int primes[N], cnt = 0;
int phi[N];
bool st[N];// 线性筛法 求欧拉函数
ll get_eulers(int n)
{phi[1] = 1;for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;phi[i] = i - 1; // i如果是质数,那么i的欧拉函数就是i-1}for (int j = 0; primes[j] <= n; j++){st[primes[j] * i] = true;if (i % primes[j] == 0){phi[primes[j] * i] = phi[i] * primes[j]; //第primes[j]*i的 欧拉函数为phi[i]*primes[j] break; // 线性筛法}phi[primes[j] * i] = phi[i] * (primes[j] - 1);}}ll res = 0;for (int i = 1; i <= n; i++) res += phi[i];return res;
}int main()
{int n = 6;cout << get_eulers(n) << endl;return 0;
}

  

* 快速幂 a^k%p

在这里插入图片描述

  if (k & 1) res = (ll)res * a % p;:如果 k 的二进制表示的最低位是 1,那么将 a 乘到 res 上,并对 p 取模。这里 (ll) 是为了将 res 和 a 转换为 long long 类型,以防止在计算过程中溢出。

  k >>= 1;:将 k 右移一位,相当于除以 2。

  a = (ll)a * a % p;:将 a 自乘,并对 p 取模。

// 快速幂 a^k%p
int qmi(int a, int k, int p)
{int res = 1;while (k){if (k & 1)res = (ll)res * a % p;k >>= 1;a = (ll)a * a % p;}return res;
}int main()
{int n=1;//cin >> n;while (n--){int a, k, p;cin >> a >> k >> p;cout << qmi(a, k, p);}return 0;
}

  
在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;// 快速幂 a^k%p
int qmi(int a, int k, int p)
{int res = 1;while (k){if (k & 1)res = (ll)res * a % p;k >>= 1;a = (ll)a * a % p;}return res;
}int main()
{int n=1;//cin >> n;while (n--){int a, k, p;cin >> a >> k >> p;cout << qmi(a, k, p);}return 0;
}

  

扩展欧几里得算法

  除了计算a、b两个整数的最大公约数,此算法还能找到整数x、y。通常谈到最大公因子时, 我们都会提到一个非常基本的事实: 给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)。

// 扩展欧几里得算法
int exgcd(int a, int b, int& x, int& y)
{if (!b){x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= a / b * x;return a;
}int main()
{int n;cin >> n;while (n--){int a, b, x, y;cin >> a >> b;exgcd(a, b, x, y);cout << x << " " << y;} return 0;
}

            

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch文档操作[ES系列] - 第502篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

阿里云OSS存储的视频如何加水印

OSS是不能进行视频添加水印的&#xff0c;可以图片添加水印。 您可以在视频点播中进行配置&#xff1a; https://help.aliyun.com/zh/vod/user-guide/video-watermarks?spma2c4g.11186623.0.i2 原来的业务代码都是使用python 对oss的 视频进行上传 的,上传的视频路径已经保存到…

qt5-入门-国际化

参考&#xff1a; Qt 国际化(上)_w3cschool https://www.w3cschool.cn/learnroadqt/fwkx1j4j.html QT5实现语言国际化&#xff08;中英文界面动态切换&#xff0c;超详细&#xff09;_qt qevent::languagechange-CSDN博客 https://blog.csdn.net/m0_49047167/article/details/…

鸿蒙Harmony应用开发—ArkTS(stateStyles:多态样式)

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以…

基于springboot的4S店车辆管理系统

基于springboot的4S店车辆管理系统 的设计和实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

c语言食堂就餐排队问题290行

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 数据结构 函数设计 结构设计 总结 效果截图 ​ 主函数代码 题目 设计一个程序来模拟食堂就餐排队问题&#xff0c;通过输入学生人数和面包数量&#xff0c;计算有多少学生能够吃到午餐。 数据结构 该…

数字资产管理系统、企业数字资产管理软件

数字资产管理系统&#xff08;DAMS&#xff09;是一系列软件&#xff0c;它提供了一个开放平台&#xff0c;支持对多媒体数据的采集、创建、管理、存储、归档、检索、传输和显示。这些多媒体数据包括图像、视频、声音、文本和电影剪辑等。这些基础软件不仅是内容创作&#xff0…

使用React搭建single-spa

自己搭建的Demo GitHub - ftao123/single-spa-react-demo: single-spa-react-demo 修改子应用的webpack配置 library: "app2"和libraryTarget: "umd"配置必须添加。 可以看到filename在开发环境下的地址是static/js/bundle.js&#xff0c;所以我们主应用…

Java多线程自定义线程池——线程池的七大参数和四大拒绝策略

线程池 2.1 线程池思想 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统…

Linux/Bizness

Enumeration nmap 用 nmap 扫描了常见的端口&#xff0c;发现对外开放了22,80,443 ┌──(kali㉿kali)-[~] └─$ nmap 10.10.11.252 Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-08 01:21 EST Nmap scan report for 10.10.11.252 Host is up (0.36s latency). Not…

python 空间距离计算

目录 python 空间距离计算 已知两点&#xff0c;画三角形 批量矩阵计算 python 空间距离计算 要在空间中找到一个点&#xff0c;使其位于点 b 和 c 之间的连线上&#xff0c;并且与点 b 的距离等于点 a 到点 b 的距离的2倍。 import numpy as npif __name__ __main__:a …

MySQL下载安装和本地连接

1、下载MySQL 从MySQL官网下载MySQL Community Server版本&#xff1a; 下载地址&#xff1a;MySQL官网 1、进入官网&#xff0c;点击DOWNLOADS 2、点击MySQL Community(GPL)Downloads 3、点击MySQL Installer for Windows 4、这个会直接跳转到最新的版本 如果想下载以往的…

题目:笨笨机器人(蓝桥OJ 3262)

问题描述&#xff1a; 解题思路&#xff1a; 用n位二进制数每位来表示每一步的状态&#xff0c;2的n次幂即使全部可能。遍历计算全部符合题意总数&#xff0c;再用cnt/(2的n次幂&#xff09;即答案。 需要注意的是&#xff0c;四舍五入后四位的方法&#xff1a;round(),可以四舍…

计算机网络——数据链路层(数据链路层功能概述)

计算机网络——数据链路层&#xff08;数据链路层功能概述&#xff09; 数据链路层的功能数据链路层的基本概念封装成帧和透明传输 我们之前已经学完了物理层的所有内容&#xff0c;今天开始我们要进入数据链路层的学习&#xff0c;如果有小伙伴对物理层的内容感兴趣的话&#…

from_pretrained 做了啥

transformers的三个核心抽象类是Config, Tokenizer和Model&#xff0c;这些类根据模型种类的不同&#xff0c;派生出一系列的子类。构造这些派生类的对象也很简单&#xff0c;transformers为这三个类都提供了自动类型&#xff0c;即AutoConfig, AutoTokenizer和AutoModel。三个…

算法系列--动态规划--子序列(2)

&#x1f495;"你可以说我贱&#xff0c;但你不能说我的爱贱。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(2),包含了关于子序列问题中较难的几道题目(尤其是通过二维状…

数据结构从入门到精通——快速排序

快速排序 前言一、快速排序的基本思想常见方式通用模块 二、快速排序的特性总结三、三种快速排序的动画展示四、hoare版本快速排序的代码展示普通版本优化版本为什么要优化快速排序代码三数取中法优化代码 五、挖坑法快速排序的代码展示六、前后指针快速排序的代码展示七、非递…

VSCode最强插件合集,助你代码开发效率翻倍!

大家好&#xff0c;我是宝哥。 今天给大家推荐14个VSCode靠前的编程辅助插件&#xff0c;它们可以帮助你提高代码编写、调试、阅读和管理效率。 1.ESLint 简介&#xff1a;用于检查JavaScript代码的语法和风格错误。 功能特色&#xff1a;支持多种规则&#xff0c;可以自定义规…

XSS-labs详解

xss-labs下载地址https://github.com/do0dl3/xss-labs 进入靶场点击图片&#xff0c;开始我们的XSS之旅&#xff01; Less-1 查看源码 代码从 URL 的 GET 参数中取得 "name" 的值&#xff0c;然后输出一个居中的标题&#xff0c;内容是 "欢迎用户" 后面…

STM32利用串口标准库发送字节,发送数组,发送字符串,发送数字,实现printf功能。

早晨到现在刚刚完成的功能&#xff1a;发送字节&#xff0c;发送数组&#xff0c;发送字符串&#xff0c;发送数字&#xff0c;实现printf功能。 当然这是建立在昨天学习使用串口发送数据的基础上&#xff0c;新建立的功能函数&#xff0c;咱们先来看看这次实验的结果吧&#…