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

相关文章

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

uva 10916 Factstone Benchmark(打表)

题意是求 k ! <= 2 ^ n ,的最小k。 由于n比较大,大到 2 ^ 20 次方,所以 2 ^ 2 ^ 20比较难算,所以做一些基础的数学变换。 对不等式两边同时取log2,得: log2(k ! ) <=  log2(2 ^ n)= n,即:log2(1) + log2(2) + log2 (3) + log2(4) + ... + log2(k) <= n ,其中 n 为 2 ^

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简