GCD+LCM+素数打表+快速幂【知识点】

2024-04-10 18:38

本文主要是介绍GCD+LCM+素数打表+快速幂【知识点】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

1.最大公约数

A(51NOD 1011)

输入2个正整数A,B,求A与B的最大公约数。

 

Ac code:
#include<iostream>
using namespace std;
int gcd(int a,int b)//最大公约数 
{return b?gcd(b,a%b):a;
}
int main()
{int a,b;cin>>a>>b;cout<<gcd(a,b)<<endl;return 0;
}

求法推演

首先考虑一下:

对于任意两个正整数 a,ba,b ,都有:

a=kb+ra=kb+r

(k,r∈N)(k,r∈N)

所以有:

r=a%b

(在这里,%指的是取余运算

然后我们假设 cc 是 aa 和 bb 的最大公约数,即

c=gcd(a,b)

然后,我们就能得到:

c|a

c|b

(在这里当然包括除了在这里的任何地方,a|b 表示 bb 能够整除 aa)

然后又因为上面那个式子,有:

r=a−kb

所以有:

c|r

整合一下上面的式子,我们可以得到:

c=gcd(b,r)

gcd(a,b)=gcd(b,a%b)

代码(递归)

int gcd(int a,int b)
{if(b==0) return a;return gcd(b,a%b);
}

这种写法就是辗转相除法

当然为了防止某些情况爆栈(比如说高精度运算什么的),还可以不用递归来写。。。

代码(迭代)

int gcd(int a,int b)
{while(b){a=a%b;swap(a,b);}return a;
}

当然本质上这两种计算方式是一样的

2.最小公倍数

B(51NOD1012)

输入2个正整数A,B,求A与B的最小公倍数。

*int会wa

AC code:
#include<iostream>
using namespace std;
long long gcd(long long a,long long b)//最大公约数 
{return b?gcd(b,a%b):a;
}
int main()
{long long a,b;cin>>a>>b;cout<<a*b/gcd(a,b)<<endl;return 0;
}

4.快速幂

定义:

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

快幂算法1

这里我们需要两个公式:

 

这两个公式都不难理解,自己可以验证一下,3^4 = 9^2。

有了这两个公式之后我们就可以考虑思路了。

我们就以b为偶数来举例。

a^b%c = ((a^2)^b/2)%c;

在这里我们假设b/2还是偶数,那么

((a^2)^b/2)%c = (((a^2)^2)^(b/2)/2)%c;到这里就可以了.

 

 

快速幂算法2

它的原理如下:

  假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时

                           

  11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0*a2^1*a2^3,也就是a1*a2*a8 

,看出来快的多了吧原来算11次,现在算三次。                                                                                           

  由于是二进制,很自然地想到用位运算这个强大的工具:&和>>    

&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。

>>运算比较单纯,二进制去掉最后一位

 

 

ll bin_pow(ll a, ll b)
{ll ans = 1;while (b > 0) {if (b&1) //奇数 {s = s * a;}a = a * a;b = b >> 1;}return ans;
}
 常规求幂int pow1(int a,int b){int r=1;while(b--) r*=a;return r;
} 快速求幂(一般)int pow2(int a,int b){int r=1,base=a;while(b!=0){if(b%2) r*=base;base*=base;b/=2;}return r;
}快速求幂 (递归)
int f(int m,int n){   //m^nif(n==1) return m;int temp=f(m,n/2);return (n%2==0 ? 1 : m)*temp*temp;
}快速求幂(位运算)
int pow3(int x,int n){if(n==0) return 1;else {while((n&1)==0){n>>=1;x*=x;}}int result=x;n>>=1;while(n!=0){x*=x;if(n&1) result*=x;n>>=1;}return result;
}快速求幂(位运算,更简洁)
int pow4(int a,int b){int r=1,base=a;while(b){if(b&1) r*=base;base*=base;b>>=1;}return r;
}

补充:C语言中移位运算符

位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移(<<)和右移(>>)两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。

这篇关于GCD+LCM+素数打表+快速幂【知识点】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.