gcd

题解 CF1216D 【Swords】

匿名 (未验证) 提交于 2019-12-03 00:11:01
大水题,感觉比C题水多了。。。 题目大意:给你$n$个数,求这$n$个数的$gcd$(最大公约数) 没有什么好说的了,注意特判$gcd$为$0$的情况,还有,提示一下: 要开$long$ $long$! 代码如下: #include <cstdio> #define ll long long inline ll read (){ ll r = 0 , f = 1 ; char c = getchar (); while ( c < '0' || c > '9' ){ if ( c == '-' ) f =- 1 ; c = getchar ();} while ( c >= '0' && c <= '9' ) r =( r << 1 )+( r << 3 )+ c - '0' , c = getchar (); return r * f ; } ll n , a [ 200002 ], Max , Min = 1e9 + 10 , y , z ; ll gcd ( ll a , ll b ){ return b ? gcd ( b , a % b ): a ; } inline ll max ( ll a , ll b ){ return a > b ? a : b ; } inline ll min ( ll a , ll b ){ return a < b ? a : b ;

HDU - 2588 GCD (欧拉函数)

匿名 (未验证) 提交于 2019-12-02 23:55:01
原题链接 题意: 给你两个数 \(N,M\) 你要求出 符合条件 \(GCD(X,N)>=M,\space (1<=X<=M)\) 中 \(X\) 的个数 思路: 一开始没有往欧拉函数去想。总想着去筛出所有合适的因子然后统计个数,或者直接暴力for去枚举因子(肯定会TLE) 后面想到了一个互质关系(即是已知 \(GCD(X,N) = q\) \(X = q*a\) , \(N=q*b\) \(则a,b必然互质\) ,然后我们就可以找到一个大于M的因子,开心的去找所有满足 小于 b 的互质个数 即可。 然鹅...这不就是欧拉函数吗?所以最后我们在 用一个欧拉函数即可(离线打表和直接算都可以) code: #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <cmath> #define IOS ios :: sync_with_stdio ( 0 ); cin . tie ( 0 ); #define accept 0 #define mp make_pair using namespace std ; typedef long long ll ; typedef unsigned long long ull ; typedef

gcd

匿名 (未验证) 提交于 2019-12-02 23:52:01
辗转相除法求最大公约数(gcd) #define ll long long ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); } View Code 拓展gcd gcd(a,b) = d 求绝对值和最小的x,y,使得a*x + b*y = d 由②可得, 由①,③可得 x1 = y2 y1 = x2 - (a/b)*y2 void exgcd(ll a,ll b,ll &x,ll &y,ll &ans){ if(b==0){ ans = a; x = 1; y = 0; return ; } exgcd(b,a%b,y,x,ans); y += (a/b)*x; return; } View Code 由拓展gcd可得 , a*x + b*y = c有解的充要条件是c为gcd(a,b)的整数倍 定理推广: ax + by + cz + ・・・+nm = f 的充要条件是f 为gcd(a,b,c,...,m)的整数倍 来源: https://www.cnblogs.com/ljinggg/p/11311844.html

最大公约数

匿名 (未验证) 提交于 2019-12-02 23:52:01
一、辗转相除法    inline int GCD(int x,int y) { int r=x%y; while(r) x=y,y=r,r=x%y; return y; }   原理证明 因为a=b+c,于是b,c的公约数也必然是a的约数,假设(b,c)=e, ((b,c)=e表示e为b和c的最大公约数)那么有elb+c,即ela, 根据"d是b,c的公约数"知道dle,, 又因为e也是a,b的公约数,eld,综上有e=d 可见(a,b)=(b,c)=d 二、二进制算法 可将x,y分为六种情况进行讨论: 若x=0或y=0:返回y或x; 若x<y:交换x,y; 若x为偶数且y为偶数:gcd(x/2,y/2); 若x为偶数且y为奇数:gcd(x/2,y); 若x为奇数且y为偶数:gcd(x,y/2); 若x为奇数且y为奇数:gcd(x-y,y); inline int gcd(int x,int y) { int n=0,m=0; while(!(x&1)) ++n,x>>=1; while(!(y&1)) ++m,y>>=1; n=min(n,m); while(1) { if(x<y) swap(x,y); if(!(x-=y)) return y<<n; while(!(x&1)) x>>=1; } } 三、最小公倍数  

拓展欧几里得 + 线性同余方程

匿名 (未验证) 提交于 2019-12-02 23:49:02
1. 辗转相除法(欧几里得算法)的证明: 1 int gcd(int a,int b){ 2 return b?gcd(b,a%b):a; 3 } 4 // 不用考虑a,b大小,会自己交换的 Ex_gcd用途:求关于 ax + by =gcd(a,b) 的所有整数解      思路:令g=gcd(a,b) ,若我们已知该方程一个特解x0,y0,则我们可以用某种方式求出所有整数解。 3. ①怎么求出这个特解?    已知 gcd(a,b) = gcd(b, a%b) 接下来讨论下两式有无关系   b * x2 + (a%b) * y2 = g(b,a%b) 可知: a * x1 + b * y1 = b * x2 + (a%b) * y2= b * x2 + (a - (a / b) * b) * y2= a * y2 + b * (x2 - (a / b) * y2) 则知道x2, y2 就可以知道x1, y1了。 因为最终辗转相除法递归出口是b=0,a为GCD,所以对 a*x+b*y=gcd(a,b) 来说,x=1,y=0;得到这个特解,在回溯回去,就可以得出原方程的一个特解   ②如何由该特解推出其他整数解?   1 void e_gcd(int a,int b,int &gcd,int &x,int &y) 2 { 3 if(b==0) 4 { 5 x=1; 6 y=0; 7

丢人选手复习exgcd//19/07/17

匿名 (未验证) 提交于 2019-12-02 23:49:02
我会了,过几个月忘了,有什么好说的...... exgcd就是在gcd上往回传系数, 这里写一下系数式子 有gcd(a,b) = xa+yb; 有gcd(b,a%b) = x'b+y'(a%b); 有gcd(a,b) = gcd(b,a%b) 则xa+yb = x'b+y'(a%b); 则xa+yb = x'b+y'(a-b*(a/b); 则得到了 代码(终于自己写一回了) long long exgcd(long long a,long long b){ if(b==0){ x=1,y=0; return a; } long long ret = exgcd(b,a%b); int xx=x,yy=y; x=yy; y=xx-(a/b)*yy; return ret; } TAG : SIN_XIII  ⑨

Codeforces Round #554 (Div. 2) C 数论

匿名 (未验证) 提交于 2019-12-02 23:33:01
https://codeforces.com/contest/1152/problem/C a和b,找到k,使得lcm(a+k,b+k)最小(a,b:1e9) 设gcd=gcd(a+k,b+k)且 \(a<b\) ,即(a+k)%gcd=0,(b+k)%gcd=0,(a+k)%gcd=(b+k)%gcd,a%gcd=b%gcd 移项得b%gcd-a%gcd=0,(b-a)%gcd=0 枚举b-a的因数即gcd,维护最小值 #include<bits/stdc++.h> #define ll long long using namespace std; ll a,b,ans,ansk,k,tp,x; int main(){ scanf("%lld%lld",&a,&b); if(a>b)swap(a,b); ans=a/__gcd(a,b)*b; ansk=0; for(ll i=1;i*i<=(b-a);i++){ //cout<<i<<endl; if((b-a)%i)continue; x=i; if(a%x!=b%x)continue; if(a%x){ k=x-a%x; tp=(a+k)/__gcd(a+k,b+k)*(b+k); if(tp<ans){ ans=tp;ansk=k; }else if(tp==ans&&k<ansk){ ansk=k; } } x=(b-a

[洛谷P2567] SCOI2010 幸运数字

你离开我真会死。 提交于 2019-12-02 21:31:05
问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”。lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”。 现在lxhgww想知道在一段闭区间[a, b]内,“近似幸运号码”的个数。 输入格式 输入数据是一行,包括2个数字a和b 输出格式 输出数据是一行,包括1个数字,表示在闭区间[a, b]内“近似幸运号码”的个数 样例输入输出 样例输入 1 10 样例输出 2 数据范围 对于30%的数据,保证1<=a<=b<=1000000 对于100%的数据,保证1<=a<=b<=10000000000 出处 四川省选2010 题目大意 定义集合 \(S\) 为包含所有 \([1,10^{10}]\) 中仅由6和8构成的数字的倍数集合。求区 \([l,r]\) 中属于 \(S\) 的元素个数。 解析 First of all 想到用类似于数位DP的方法,对每一位枚举选择哪个数,然后对每个构造出来的在区间 \([l,r]\)

Java代码

老子叫甜甜 提交于 2019-12-02 10:43:57
** 求最大公约数和 最小公倍数 ** package homework; import java.util.Scanner; public class 最大公约数和最大公倍数 { public static int GCD(int a,int b){ int tmp=1; for(int i=0;;i++){ tmp=a%b; if(tmp==0){ break; } a=b; b=tmp; } return b; } public static int LCM(int a,int b){ int temp=GCD(a,b); return (a*b)/temp; } public static void main(String[] args) { int m,n; Scanner reader=new Scanner(System.in); System.out.println("enter m and n"); m=reader.nextInt(); n=reader.nextInt(); int gcd,lcm; //gcd 最大公约数,LCM最小公倍数 gcd=GCD(m,n); lcm=LCM(m,n); System.out.print("最大公因数:"); System.out.println(gcd); System.out.print("最小公倍数:");

《Python编程从0到1》笔记3——欧几里得算法

巧了我就是萌 提交于 2019-12-02 08:24:46
本节以欧几里得算法(这是人类历史上最早记载的算法)为示例,向读者展示注释、文档字符串(docstring)、变量、循环、递归、缩进以及函数定义等Python语法要素。 欧几里得算法:“在数学中,辗转相除法,又称欧几里得算法(Euclidean algorithm),是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。”---《维基百科.辗转相除法》 在实际操作中,可以使用带余数除法替代减法以减少步骤。下面是使用流程图绘制的算法示意图: 图 1.2 欧几里得算法流程图 在程序设计实践中,很少针对简单的程序绘制流程图。因为对于熟练的程序设计者来说,代码本身足以清晰地说明程序的执行流程。流程图往往用于描述大的软件系统的工作原理,或者用来辅助不够结构化的语言(如汇编语言)。 根据前述算法描述,计算252和105的最大公约数的计算步骤如下: 1.252除以105余42,问题转为求105和42的最大公约数; 2.105除以42余21,问题转为求42和21的最大公约数; 3.42除以21可以除尽,达到算法终点; 4.结论:252和105的最大公约数为21。 代码 1