数论<1>——数论基础

这期博客是一个数论入门介绍,dalao们可以自动忽略。

Part 1:素数(质数)

说到数论,小学奥数里也有。我最先想到的就是质数了。素数就是一个只能被1和它自己整除的数。判断的方法也很简单,可以\Theta (n)扫一遍就结束了,但是没必要。由于一个数的因数肯定分布在\Theta (\sqrt{n})的左边和右边。因此,只用扫描到\sqrt{n}就够了。

bool isprime(int n){if(n<2)//0和1都不是质数 return false;for(int i=2;i<=n/i;i++){//这里i<=n/i是一个防止i*i爆int以及sqrt(n)精度不好的小技巧 if(n%i==0)return false;}return true;
}

现在,我们知道如何判断一个数是不是质数的方法了。现在,我们向分解G(质因)数。我们\Theta (\sqrt n)的扫描,只要i是n的因数,就把i塞进一个map里,然后除掉n里面所有的i。这样就保证了每个i都是素数,顺便记录次数。最后,有可能n不为0,所以要特判。

map<int,int> fac;//分别是:质因子,次数
for(int i=2;i<=n/i;i++){if(n%i==0){while(n%i==0){n/=i;fac[i]++;}}
}
if(n)//特判fac[n]=1;

在这里,我补充几个公式:

唯一分解定理:N=p_{1}^{\alpha _{1}} \cdot p_{2}^{\alpha _{2}} \cdot ......\cdot p_{k}^{\alpha_{k}}

因数个数定理:(\alpha_{1}+1)\cdot (\alpha_{2}+1) \cdot ......(\alpha_{k}+1)

因数和定理:(p_{1}^{0}+p_{1}^{1}+...+p_{1}^{\alpha_{1}})\cdot (p_{2}^{0}+p_{2}^{1}+...+p_{2}^{\alpha_{2}})\cdot ......\cdot (p_{k}^{0}+p_{k}^{1}+...+p_{k}^{\alpha_{k}})

-------------------------------------------------华丽的分割线--------------------------------------------------------

接下来,我们来谈一个比较有意思的东西。首先,如果我让你打印100以内的素数表,你会怎么做?根据刚刚的判断素数的方法,我们可以\Theta (n \sqrt{n})的解决这个问题。但是如果数据放大到10^6甚至10^7,怎么办?

这就要用到素数筛了。素数筛就是一种算法,可以帮你快速筛出素数。有两种筛法,埃筛和欧筛。分别由欧拉和bla~bla~(埃拉托色尼)发明的。先说埃氏筛法(因为好懂),这个算法的核心就是素数的倍数一定是合数。然后,我们就可以愉快的写代码了。

bool isprime[maxn];
void sieve(){memset(isprime,true,sizeof(isprime));isprime[0]=isprime[1]=false;for (int i=2;i<=maxn/i;i++){if(isprime[i]){for(int j=i*i;j<=maxn;j+=i)isprime[j]=false;}}
}

埃筛的复杂度为\Theta (n \: log \: log \: n),略微有点高,但是好记。

接下来我们来看看复杂度接近\Theta (n)的欧拉筛。埃筛的问题在于素数会被标记多次,那我们优化的方法就是让合数只被标记一次。同时,欧拉筛也叫线性筛(复杂度是线性的嘛)。

bool notprime[maxn];
vector<int> prime;
void sieve(){notprime[1]=true;for(int i=2;i<=maxn;i++){if(!notprime[i])prime.push_back(i);for(int x:prime){if(i*x>maxn)break;notprime[i*x]=true;if(i%x==0)break;}}
}

注意,一定要用notprime,不然又回到埃筛了。

这里就不放例题了,因为其实就是板子。

Part 2:最大公因数和最小公倍数

最大公因数和最小公倍数都是小学奥数学过的东西。但还是稍微介绍一下吧。顾名思义,最大公约数是两个数最大的公约数,最小公倍数是两个数最小的公倍数。接下来,我们来看看如何求最大公约数和最小公倍数。

最大公约数:辗转相除法,即gcd(a,b)=gcd(b,a \: mod \: b) \: (a<b) 。证明嘛,我不大会,但......

OI-Wiki!

放个代码。

int gcd(int a,int b){if(b==0)return a;return gcd(a,b%a);
}
//当然,STL里有一个函数叫__gcd
//它也可以求gcd,所以我们就不用自己写啦(*^▽^*)

顺便说一句,如果gcd(a,b)=1,那我们称a,b互质。欧几里得算法时间复杂度\Theta (log \: max(a,b))

接下来看最小公倍数的求法。先给结论:

int lcm(int a,int b){return a*b/__gcd(a,b);
}

为什么?我们令a=p_1^{k_{a_{1}}}\cdot p_2^{k_{a_{2}}}\cdot ...\cdot p_s^{k_{a_{s}}},b=p_1^{k_{b_{1}}}\cdot p_2^{k_{b_{2}}}\cdot ...\cdot p_s^{k_{b_{s}}},那么:

(a,b)=p_1^{min(k_{a_{1}},k_{b_{1}})}\cdot p_2^{min(k_{a_{2}},k_{b_{2}})}\cdot ...\cdot p_s^{min(k_{a_{s}},k_{b_{s}})}

[a,b]=p_1^{max(k_{a_{1}},k_{b_{1}})}\cdot p_2^{max(k_{a_{2}},k_{b_{2}})}\cdot ...\cdot p_s^{max(k_{a_{s}},k_{b_{s}})}

由于k_a+k_b=max(k_a,k_b)+min(k_a+k_b),所以a\times b=lcm(a,b)\times gcd(a,b)

Part 3:扩展欧几里得

我们先来看一个方程:ax+by=c 而它,是终极大Boss。那么它什么时候有解呢?

(a,b)\mid c是,方程有解。So,c必然是gcd(a,b)的倍数。所以,我们先看ax+by=(a,b)的情况,这也是扩展欧几里得解决的问题。

根据欧几里得算法,得ax+by=gcd(a,b)=gcd(a,a \: mod \: b),接下来递归又变成了这个↓

bx+(a \: mod \: b)y=gcd(b, a \: mod \: b)。我们叫这个bx_1+(a \: mod \: b)y_1=gcd(b,a \: mod \: b)

然后就知道ax_0+by_0=bx_1+(a \: mod \: b)y_1,所以x_0=y_1,y_0=x_1-(a*b)/y_1

当你递归到最后一层,也就是b=0的时候,你就解得x'=1,y' \epsilon R。然后我们在向上递归,得出开

始的x和y。Talk is cheap,show me your code.

int exgcd(int a,int b,int &x,int &y){if(b==0){x=1;y=0;return a;}int res=exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y;return res;
}

说了这么多,来练练手吧。

P1082:

乍一看,你可能会问:这和扩展欧几里得有啥关系?问的有理,我们来做一些恒等变形。

ax\equiv 1(mod\:b)其实相当于ax+by=1。可这还是跟ax+by=(a,b)不一样啊,没关系。有

解的情况是c\mid gcd(a,b),而1一定满足。现在,它就变成了exgcd的板子题啦!

#include <bits/stdc++.h>
using namespace std;
//exgcd
int main(){int a,b,x,y;cin>>a>>b;int res=exgcd(a,b,x,y);if(x<0)x+=b;cout<<x<<endl;return 0;
}

ABC186E:

洛谷上也有。转圈,不难想到同余。

我们可以列出方程S+Kx\equiv 0\: (mod\: N),得Kx\equiv -S\: (mod \: N),再把右边加上N,解x就

ok了。和上一题相似。

#include <bits/stdc++.h>
using namespace std;
long long x,y;
long long exgcd(long long a,long long b){if(b==0){x=1;y=0;return a;}long long res=exgcd(b,a%b);long long tmp=x;x=y;y=tmp-a/b*y;return res;
}
long long main(){int T;cin>>T;while(T--){long long N,S,K;cin>>N>>S>>K;long long res=exgcd(K,N);long long t=(N-S)%N;if(t%res)cout<<-1<<endl;elsecout<<(x%N+N)%N*(t/res)%(N/res)<<endl;	}return 0;
}

P1516:

这两个青蛙是真够笨的。

起点是a,b;速度是m,n;步数是t;套圈k次,得(m-n)t-lq=b-a。一个不定方程!所以用扩展

欧几里得算法求解。

//十年OI一场空,不开long long见祖宗
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y){if(b==0){x=1;y=0;return a;}int res=exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y;return res;
}
int main(){int a,b,m,n,l,t,q;cin>>a>>b>>m>>n>>l;if(m<n){swap(m,n);swap(a,b);}int res=exgcd(m-n,l,t,q);if((b-a)%res!=0){cout<<"Impossible"<<endl;return 0;}int ans=t*(b-a)/res;int step=l/res;ans%=step;if(ans<0)ans+=step;cout<<ans<<endl;return 0;
}

 好了Y(^o^)Y,以上就是本期的全部内容了。我们下期再见!

友情提醒:本期的题解代码都有问题,请不要无脑Ctrl C+Ctrl V

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

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

相关文章

Hudi入门

一、Hudi编译安装 1.下载 https://archive.apache.org/dist/hudi/0.9.0/hudi-0.9.0.src.tgz2.maven编译 mvn clean install -DskipTests -Dscala2.12 -Dspark33.配置spark与hudi依赖包 [rootmaster hudi-spark-jars]# ll total 37876 -rw-r--r-- 1 root root 38615211 Oct …

【NR 定位】3GPP NR Positioning 5G定位标准解读(十一)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

QT中使用QProcess执行命令,实时获取数据,例如进度条

前言 因为之前写了一个接收和发送文件的脚本&#xff0c;然后又需要获取进度&#xff0c;同步到进度条中。 效果&#xff1a; 使用正则匹配&#xff0c;获取命令行命令中的以下数据&#xff0c;然后同步到进度条 源码demo&#xff1a; 非完整代码&#xff1a; #include <Q…

nodejs web服务器 -- 搭建开发环境

一、配置目录结构 1、使用npm生成package.json&#xff0c;我创建了一个nodejs_network 文件夹&#xff0c;cd到这个文件夹下&#xff0c;执行&#xff1a; npm init -y 其中-y的含义是yes的意思&#xff0c;在init的时候省去了敲回车的步骤&#xff0c;如此就生成了默认的pac…

山泉还可以申请商标不,现阶段通过率如何!

在32类类别啤酒饮料是许多生产水企业主要申请注册的类别&#xff0c;那现在山泉在这个类别还可以申请注册商标不&#xff0c;山泉在这个类别基本上是通用词&#xff0c;首先是需要前面词具有显著性&#xff0c;没的相同或近似才可以。 经普推知产老杨检索发现&#xff0c;在32…

手机APP测试——如何进行安装、卸载、运行?

手机APP测试——主要针对的是安卓( Android )和苹果IOS两大主流操作系统,主要考虑的就是功能性、兼容性、稳定性、易用性、性能等测试&#xff0c;今天先来讲讲如何进行安装、卸载、运行的内容。 一、App安装 1、点击运行APP安装包,检测安装包是否正常; . 2、进入[安装向导]…

自动驾驶感知面试-coding应用题

感知面试手撕代码&#xff1a;这个博主总结的很好&#xff0c;尤其是关于叉积的计算 双线性插值 双线性插值公式记忆方法和Python实现 NMS算法 #include<iostream> #include<vector> #include<algorithm>using namespace std; struct Box {int x1,x2,y1,…

Pytorch学习 day09(简单神经网络模型的搭建)

简单神经网络模型的搭建 针对CIFAR 10数据集的神经网络模型结构如下图&#xff1a; 由于上图的结构没有给出具体的padding、stride的值&#xff0c;所以我们需要根据以下公式&#xff0c;手动推算&#xff1a; 注意&#xff1a;当stride太大时&#xff0c;padding也会变得很大…

【NR 定位】3GPP NR Positioning 5G定位标准解读(九)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

基于springboot+vue的食品安全管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 1 首页 2 后台登录 3 食品信息添加页面 4 食品查询 三、库表设计 四、论文 前言 从事食品行业的商家可能会对于食品的储存以及食品的销售&#xff0c;都有着不同门道的想法&#xff0c;那么如何能将这些想法一一实现&#xff0c;…

大模型笔记:幻觉 hallucination

1 介绍 “幻觉” (Hallucination)&#xff0c;指模型生成自然流畅&#xff0c;语法正确但实际上毫无意义且包含虚假信息即事实错误的文本&#xff0c;以假乱真&#xff0c;就像人产生的幻觉一样。 举个例子就是&#xff0c;即使现在的chatgpt-4&#xff0c;你问他一些有确切…

计算机网络 八股

计算机网络体系结构 OSI&#xff1a;物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

文章目录 一、使用 ffmpeg 命令提取 音视频 数据1、提取音频数据 - 保留封装格式2、提取视频数据 - 保留封装格式3、提取视频数据 - 保留编码格式4、提取视频数据 - 重新编码5、提取音频数据 - 保留编码格式6、提取音频数据 - 重新编码 一、使用 ffmpeg 命令提取 音视频 数据 1…

如何批量加密U盘?U盘如何批量设置密码?

但U盘数量较多时&#xff0c;加密U盘的工作就会非常麻烦。这时你需要使用U盘批量加密工具。那么&#xff0c;如何批量加密U盘&#xff1f; 批量加密U盘 想要实现U盘批量加密&#xff0c;我们需要使用专业的U盘批量加密工具&#xff0c;如U盘内存卡批量只读加密专家。它支持批量…

RabbitMQ发布确认高级版

1.前言 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&…

代码随想录训练营第41天 | 动态规划:01背包理论基础、动态规划:01背包理论基础(滚动数组)、LeetCode 416.分割等和子集

动态规划&#xff1a;01背包理论基础 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;_哔哩哔哩_bilibili 动态规划&#xff1a;01背包理论基础&#xff08;滚动数组&#xff09; 文章讲解&#xff1a;代码随想录(…

Cocos Creator 2d光照

godot游戏引擎是有2d光照的&#xff0c;用起来感觉还是很强大的&#xff0c;不知道他是怎么搞的&#xff0c;有时间看看他们怎么实现的。 之前一直以为cocos社区里面没有2d光照的实现&#xff0c;偶然看到2d实现的具体逻辑&#xff0c;现在整理如下&#xff0c; 一&#xff1…

【java】22:try-catch 异常处理

try-catch 方式处理异常说明 public static void main(String[] args) { int num1 10; int num2 0; try { int res num1 / num2; } catch (Exception e) { System.out.println(e.getMessage()); } } 注意事项 1)如果异常发生了&#xff0c;则异常发生后面的代码不会执行&…

前后端分离项目Docker部署指南(下)

目录 前言&#xff1a; 一.安装nginx 创建目录 上传nginx.conf至/data/nginx/conf文件夹中 运行启动容器 上传静态资源文件 ​编辑 访问结果 前言&#xff1a; 在上一篇博客中&#xff0c;我们深入探讨了如何使用Docker部署一个前后端分离的项目中的后端部分。我们构建…

基于qt的图书管理系统----05其他优化

参考b站&#xff1a;视频连接 源码github&#xff1a;github 目录 1 优化借阅记录显示2 时间显示为年月日3 注册接口 1 优化借阅记录显示 现在只能显示部分信息&#xff0c;把接的书名和人的信息全部显示 在sql语句里替换为这一句即可实现查询相关联的所有信息 QString str…