c++专题四

news/2025/2/10 22:43:36/文章来源:https://www.cnblogs.com/sssyyyqqq/p/18708919

c++专题四学习日记

1.整除

存在整数k使得a=b*k;称为b整除a,记作b|a

2.同余

如果a-b=km (k∈Z),则a与b模m同余,记作a≡b(mod m)

(a mod b :a%b

3. GCD最大公约数

辗转相除法(欧几里得算法):


$$
a=b*q+r(0≤r<b)
$$

$$
gcd(a,b)=gcd(b,r)
$$

代码实现gcd:
int gcd(int a,int b){while(b!=0){int r=a%b;a=b;b=r;}return a;
}

裴蜀定理(Bezout's Identity):

对于任意整数 和 ,存在整数 和 使得
$$
ax+by=gcd(a,b)
$$

扩展欧几里得算法(exgcd):

同时求gcd(a,b)和一组整数x,y.

// 求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, x, y);int temp=y;    //推出这一层的x,yy=x-(a/b)*y;x=temp;return d;
}

//当上一层的解是x1,y1,则bx1 + (a%b)y1 = gcd(a,b)

​ --->bx1+(a-(a/b)b)*y1 = gcd(a,b)

​ --->ay1+ b(x1-(a/b)*y1) = gcd(a,b)

​ 则下一层的x,y:x=y1 ; y= x1-(a/b)*y1

求乘法逆元:

1.用exgcd

求a的乘法逆元x使得ax≡1(mod m)(前提gcd(a,m)=1

//exgcd返回g,x,y
#include <tuple>
// 扩展欧⼏⾥得算法:返回 (g, x, y),满⾜
// x * a + y * b = g = gcd(a, b)
std::tuple<long long, long long, long long> extendedGCD(long long a, long long b) {
if (b == 0)
return {a, 1, 0};
auto [g, x1, y1] = extendedGCD(b, a % b);
long long x = y1;
long long y = x1 - (a / b) * y1;
return {g, x, y};
}// 计算 a 关于模 m 的乘法逆元,若不存在则返回 -1
long long modInverse(long long a, long long m) {
auto [g, x, y] = extendedGCD(a, m);
if (g != 1) {
// a 与 m 不互质,逆元不存在
return -1;}
// 保证 x 为正
x %= m;
if (x < 0)
x += m;
return x;
}
2.快速幂(基于费马小定理

费马小定理:当模m是质数时:
$$
a^{m-1}≡1(mod m)
$$
所以:
$$
a{m-2}≡a(mod m)
$$

// 快速幂计算:计算 a^b mod mod
long long modExp(long long a, long long b, long long mod) {long long res = 1;a %= mod;while (b > 0) {if (b & 1)res = (res * a) % mod;a = (a * a) % mod;b >>= 1;}return res;
}
// 计算 a 关于模 m 的乘法逆元(m 为质数)
long long modInverseFast(long long a, long long m) {// 根据费⻢⼩定理,a^(m-2) mod m 即为 a 的逆元return modExp(a, m - 2, m);
}

埃式筛

bool st[N];//存合数
vector<int> pr;
void init(){for(int i=2;i<N;i++){if(!st[i]) pr.push_back(i);for(auto zz:pr){if(zz*i>=N)break;st[zz*i]=true;if(i%zz==0)break;}}
}

线性筛

#include <vector>
using namespace std;
class LinearSieve {
public:// 筛选出的素数列表vector<int> primes;// 标记数组:isComposite[i] 为 true 表示 i 是合数(⾮素数)vector<bool> isComposite;// 构造函数:筛选 2 到 n 范围内的所有素数LinearSieve(int n) {isComposite.assign(n + 1, false);// 从 2 开始筛for (int i = 2; i <= n; i++) {if (!isComposite[i]) {primes.push_back(i);}for (int p : primes) {if (i * p > n)break;isComposite[i * p] = true;if (i % p == 0)break;}}}
};

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

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

相关文章

并行计算架构和编程 | 目录

from pixiv JW资源汇总 前言 开新坑了,尽量完成它吧. 此篇博客为目录章节,主要汇总学习过程中用到的资料,记录时间线。 SourceCS自学指南 CMU 15-418/Stanford CS149: Parallel Computing 了解此课程的主要起始地,下面的评论含有价值的信息 PKUFlyingPig/CS149-parallel-co…

使用Microsoft/Windows LAPS管理本地管理员密码

什么是LAPS Local Administrator Password Solution,简称LAPS,是微软提供的一种用于管理本地管理员密码的解决方案。用于在Active Directory(AD)环境中自动管理和轮换众多客户端Windows的本地管理员账户及密码。 在没有这个工具之前, 本地管理员密码管理会非常的复杂。比如…

Avalonia系列文章之布局简介

在UI设计中,页面布局非常重要,良好的布局不仅可以有效的利用空间,还能提升交互体验,以达到事半功倍的效果。所以对于Avalonia UI初学者来说,布局控件的了解与学习也非常的重要,今天以一些小例子,简述Avalonia UI框架中布局控件的使用,仅供学习分享使用,如有不足之处,…

ACM寒假集训第四期

ACM寒假集训第四期 有理数取余 思路 bx=a mod m x=((a mod m) * ( b^(-1) ) mod m)) mod m; 问题就转化为如何求解 b 的逆元 b x = 1 mod m ,b对m的逆元,当 gcd(b,m)=1 时才存在。存在 bx+my=1 通过辗转相除法可以得到b,m的最大公约数然后根据最后得到的一系列等式合并为 bx+m…

昆明理工大学2025年硕士研究生调剂汇总表(2月10日更新)

这是今年昆明理工大学调剂信息,目前只更新了部分学院的部分专业,后续会持续更新。 【腾讯文档】昆明理工大学2025年硕士研究生调剂汇总表 https://docs.qq.com/sheet/DZERIbnpPb3JjeHFO

推荐一款人人可用的开源 BI 工具,更符合国人使用习惯的数据可视化分析工具,数据大屏开发神器!

前言 今天大姚给大家推荐一款人人可用的开源、免费的 BI 工具,更符合国人使用习惯的数据可视化分析工具,数据大屏开发神器,Tableau、帆软的开源替代:DataEase。工具介绍 DataEase是一个开源的数据可视化分析工具,可以帮助用户快速分析数据并洞察业务趋势,从而实现业务的改…

清华大学推出的 DeepSeek 从入门到精通(104页)免费教程!

前言 最近 DeepSeek 的出现让 AI 在国内掀起了一股浪潮,各大媒体、平台都在讨论和推广 DeepSeek,帮助各行各样使用 AI 不再有困难。今天大姚给大家分享一个由清华大学推出的、免费的:DeepSeek从入门到精通实用教程,该教材有着足足的104页能够快速的帮助大家了解和使用DeepS…

卞俊良

卞俊良 你猜 你猜我猜不猜

P1314 [NOIP 2011 提高组] 聪明的质监员(前缀和)

这道题最核心就是二分W,然后对于每一个W都构建一个前缀和数组,但要注意ans不能开太小,我开INT_MAX都不行,其次就是二分左右端点的变化,如果s-y>0说明满足要求的点多了,这时候我们要提高标准,就是让W增大,及让beign=W+1,反之让end=W-1;如果s=y,此时ans=0;这时候我…

读读源码-ArrayList究竟是怎么实现增强for循环的?

以我的认知来说,java中的ArrayList实现List,List又是继承Collection,往后就不太清楚了。 今天看源码的时候发现Collection继承了Iterable,Iterable接口的作用是允许对象称为for-each loop语句的目标。 因此如果想了解ArrayList如何实现循环,我们必须先从Iterable看起 1.集…