gcd

求两个整数的 GCD/LCM

坚强是说给别人听的谎言 提交于 2020-01-18 05:40:40
最大公约数[Greatest Common Divisor(GCD)]:指两个或多个整数共有约数中最大的一个,通常记为 (a, b) 最小公倍数[Least Common Multiple(LCM)]:两个或多个整数的公倍数里最小的那一个叫做它们的最小公倍数 [a, b] 求最大公约数常见方法有:质因数分解法、短除法、辗转相除法、更相减损法、stain算法 求最小公倍数,可由最大公约数得到,gcd(a, b) * lcm(a, b) = ab 在坐标里,将点(0, 0)和(a, b)连起来,通过整数坐标的点的数目(除了(0, 0)一点之外)就是gcd(a, b) 重要性质:gcd(a,b)=gcd(b,a) (交换律) gcd(-a,b)=gcd(a,b) gcd(a,a)=|a| gcd(a,0)=|a| gcd(a,1)=1 gcd(a,b)=gcd(b, a mod b) gcd(a,b)=gcd(b, a-b) 待续…… 来源: https://www.cnblogs.com/excavator/p/4544906.html

浅谈拓展欧几里得算法、最小整整数解与乘法逆元

你。 提交于 2020-01-15 14:55:45
欧几里得: 首先要明确欧几里得算法,就是我们所说的辗转相除法。 就是求两个数a,b的最大公因数gcd(a,b) ll gcd ( ll a , ll b ) //欧几里得算法 { //辗转相除法 if ( a % b == 0 ) return b ; return gcd ( b , a % b ) ; } 拓展欧几里得算法 通俗来说就是求二元一次方程 Ax+By=gcd(A,B) 的(x,y)的所有的解。(假设A,B已知) 我们的方法是通过这组方程的一个特解,得出他的通解。 那么就有两个问题 1.如何得到他的特解? 2.如何得由特解得到通解? **** 1.找特解 由欧几里得算法可以将gcd(A,B)写成gcd(B,A%B)。 得到一个新的方程 Bx2+(A%B) * y2=gcd(B,A%B); -------------1 A%B=A-(A/B)*B; 再次改写方程 Bx2+[A-(A/B) * B ] y2=gcd(B,A%B);*------------2 当gcd(B,A%B)一直向下写,直到A%B=0 时; 由1号方程得 Bx2=B; 这时候我们得出方程的一组特解为x2=1,y2=0; 此时我们已经解决了第一个问题找到方程组的特解。 2.如何由特解得出通解 继续观察式子 2 。我们既然已经得出特解x2与y2。那么我们要是知道x2与x的关系,y2与y的关系

求两个数的最小公倍数

删除回忆录丶 提交于 2020-01-13 22:06:06
求两个数的最小公倍数 求最小公倍数我们应想到使用 gcd(a,b) # include <iostream> using namespace std ; int gcd ( int a , int b ) { return a % b == 0 ? b : gcd ( b , a % b ) ; } int main ( ) { int a , b , c ; cin >> a >> b ; c = gcd ( a , b ) ; cout << c ; return 0 ; } 来源: CSDN 作者: 骚气小白 链接: https://blog.csdn.net/weixin_44842483/article/details/103963523

The GCD of Fibonacci Numbers

北城余情 提交于 2020-01-12 23:14:29
题目 The Fibonacci sequence is the sequence of numbers such that every element is equal to the sum of the two previous elements, except for the first two elements f0 and f1 which are respectively zero and one. The first few numbers in the Recaman’s Sequence is 0,1,1,2,3,5,8,… The i-th Fibonacci number is denoted fi. The largest integer that divides both of two integers is called the greatest common divisor of these integers. The greatest common divisor of a and b is denoted by gcd(a,b). Two positive integers m and n are given,you must compute the GCD(fm,fn). Input The first linecontains one

latex的listings宏包常用设置

夙愿已清 提交于 2020-01-10 08:14:16
\documentclass[UTF-8]{article} \usepackage{listings} \usepackage{color,xcolor} \usepackage{fontspec} \usepackage{xeCJK} \setmonofont[Mapping={}]{Monaco} %英文引号之类的正常显示,相当于设置英文字体 \setsansfont{Monaco} %设置英文字体 Monaco, Consolas, Fantasque Sans Mono \setmainfont{Monaco} %设置英文字体 \setCJKmainfont{微软雅黑} %中文字体设置 %\setCJKsansfont{楷体} %设置中文字体 %\setCJKmonofont{} %设置中文字体 \definecolor{mygreen}{rgb}{0,0.6,0} \definecolor{mygray}{rgb}{0.5,0.5,0.5} \definecolor{mymauve}{rgb}{0.58,0,0.82} \lstset{ backgroundcolor=\color{white}, % choose the background color basicstyle=\footnotesize\monaco, % size of fonts used for

CF803C Maximal GCD

泄露秘密 提交于 2020-01-09 07:08:34
洛谷 CF 分析 考虑从 \(k\) 个数的 \(gcd\) 入手。 设他们的 \(gcd\) 为 \(d\) 。则有 \(d|n\) ,那么这 \(k\) 个数都除以 \(d\) 剩下的和即为 \(\frac{n}{d}\) ,又由于 \(k\) 个数严格上升,那么我们将 \(1\) 到 \(k\) 的和记为 \(sum\) ,有 \(sum=k*(k+1)/2\) 。于是必有 \(sum<=n/d\) ,所以我们可以枚举 \(n\) 的因数,判断是否满足条件,再取最大值即可。 剩下的我们只需构造 \(k\) 个数,使其和等于 \(n/d\) ,最后输出时将每个数再乘 \(d\) 。 贪心的想,我们直接将这组数构造成 \(1,2,3...k-1,k\) ,若 \(sum<n/d\) ,直接将这组数的最后一个数 \(k\) 更改为 \(k+n/d-sum\) 即可。 一些废话: 这题真的毒瘤。。。。。。本来没想多久就做出来的,结果一改就改了一个上午,总是在第21个点T,把数据蒯下来自己测也确实很慢,但却不知道是为什么, \(O(\sqrt{n})\) 的算法也能这么慢...... 下午看了题解,发现和我的方法一模一样,只是代码不同。我这该怎么改啊? 百思不得其解后,发现题解的 \(sum\) ,都是直接写的 \(k*(k+1)/2\) 而不是定义一个变量代替这个式子,于是我用了

程序设计:蒜头君的数轴

╄→尐↘猪︶ㄣ 提交于 2020-01-08 02:15:34
程序设计:蒜头君的数轴 (考数论知识) 今天蒜头君拿到了一个数轴,上边有 n 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同。蒜头君想知道,他最少需要加多少个点使这个数轴变优美。 输入格式 输入第一行为一个整数 n(1<=n<=10^5)表示数轴上的点数。第二行为 n 个不重复的整数 x1​,x2​,…,xn​(-10^9 ≤xi​≤10^9),表示这些点的坐标,点坐标乱序排列。 输出格式 输出一行,为一个整数,表示蒜头君最少需要加多少个点使这个数轴变优美。 样例输入 4 1 3 7 15 样例输出 1 思路:该题考察的是数论里边的最大公约数,自己也是从开始的摸不着头脑,一点一点解析题意。 首先分析题目,n个点都在数轴上,并且起初是乱序(想到这里就需要对这组整数排序),优美就是n个点分成了n-1个线段,这n-1个线段的长度最多有1个距离与其他不同,你要做的就是进行加点满足优美的条件,该题是问加了多少点,所以只需考虑加的点数即可。 先存入n个整数,求出n-1个距离(求出n-1个距离和,后边有用),然后我们通过删去其中一个距离(注意是依次删除每个距离,就是枚举)求其他n-2个距离的最大公因数gcd,同时也得求出sum(n-2个距离和),用sum除gcd就是你n-2个距离被均等的分成若干段

P5887-Ringed Genesis【GCD】

自作多情 提交于 2020-01-04 02:07:09
正题 题目链接: https://www.luogu.com.cn/problem/P5887?contestId=24709 题目大意 n n n 个洞围成一个环,兔子每次会往前跳 k k k 个洞, m m m 只兔子给出其实位置,求有多少个洞不会被经过。 解题思路 我们可以发现 k x + n y = c kx+ny=c k x + n y = c ,有 c ∣ g c d ( k , n ) c|gcd(k,n) c ∣ g c d ( k , n ) 。 那么对于每个兔子的起点 p p p ,可以覆盖任何 z ∗ g c d ( k , n ) + p ‘ 在 这 里 插 入 代 码 片 ‘ ( z ∈ N ) z*gcd(k,n)+p`在这里插入代码片`(z\in N) z ∗ g c d ( k , n ) + p ‘ 在 这 里 插 入 代 码 片 ‘ ( z ∈ N ) ,所以我们开一个大小为 g c d ( k , n ) gcd(k,n) g c d ( k , n ) 的桶就好了。 c o d e code c o d e # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; int n , m , k , z , p , ans ; bool v

java递归调用 return的问题

淺唱寂寞╮ 提交于 2020-01-02 22:32:08
最近比较闲,写了个递归调用获取最大公约数,刚开始写错了,但一直不明白错在哪,错误代码如下: public class Demo { public static void main(String[] args) { int gcd = gcd(5, 15); System.out.println(gcd); } private static int gcd(int a, int b) { if (b != 0) { int i = a % b; a = b; b = i; gcd(a, b); } return a; } }   刚开始一直想不明白为什么当b!=0的时候 不直接return a的值 而是往gcd方法里走,直到a等于传入的值时才返回 后来就写了2个方法来debug 找到原因后 修改代码如下: public class Demo { public static void main(String[] args) { int gcd = gcd(4, 10); System.out.println(gcd); } private static int gcd(int a, int b) { if (b != 0) { int i = a % b; a = b; b = i; return gcd(a, b); } return a; } } 来源: https://www

2016 Multi-University Training Contest 1

前提是你 提交于 2019-12-31 02:21:43
官方题解: http://bestcoder.hdu.edu.cn/blog/2016-multi-university-training-contest-1-solutions-by-hit/ 题目链接: A http://acm.hdu.edu.cn/showproblem.php?pid=5723 第一步求最小生成树,因为题目限制边权各不相同,所以最小生成树唯一。第二步求任意树上任意两点距离的均值,通过计算每条边对总和的贡献得到。枚举每条边,经过次数等于该边左边点的个数乘右边点的个数。dfs求有根树每个点子树节点个数的办法。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int M=1e6+10; 4 struct E { 5 int u,v; 6 double w; 7 } e[M]; 8 int n,m; 9 double cost; 10 double average; 11 struct G{ 12 struct E{ 13 int v,next; 14 double w; 15 }e[M]; 16 int le,head[M]; 17 void init(int n){ 18 le=0; 19 for(int i=0;i<=n;i++) head[i]=-1; 20 } 21 void add