最大公约数

1627:【例 3】最大公约数

风格不统一 提交于 2019-11-28 04:57:50
1627:【例 3】最大公约数 时间限制: 1000 ms 内存限制: 524288 KB 提交数: 592 通过数: 72 【题目描述】 给出两个正整数 A , B ,求它们的最大公约数。 【输入】 输入共两行,第一行一个正整数 A ,第二行一个正整数 B 。 【输出】 在第一行输出一个整数,表示 A , B 的最大公约数。 【输入样例】 18 24 【输出样例】 6 【提示】 数据范围与提示: 对于 60% 的数据, 1 ≤ A , B ≤ 10 18 ; 对于 100% 的数据, 1 ≤ A , B ≤ 10 3000 。 其实这道题就是裸高精, 十分的简单 ,因为我的脑壳有问题打完之后自信满满却发现漏洞百出,调了一个小时才搞好。。。 #include<bits/stdc++.h> using namespace std; const int base=10000; int a[10000],b[10000],c[10000],f[10000],T; void Print(int a[]) { int i,j; cout<<a[a[0]]; for(i=a[0]-1;i>0;i--) for(j=base/10;j>0;j/=10) cout<<a[i]/j%10; } void Init(int a[]) { string s; cin>>s; int len=s

整除理论

社会主义新天地 提交于 2019-11-28 02:20:14
整除也是一片新天地呢qwq 整除的定义:设n为非负整数,d为正整数,如果n/d为整数。则称d整除n,记作d|n。 任何正整数都整除0。 约数:设n为非负整数,d为正整数,如果存在d|n,则称d为n的约数。 最大公约数(GCD):设a为正整数,b为正整数,a和b的所有约数中,相同且最大的那个称为a,b的最大公约数, 记作gcd(a,b)。 最大公约数的性质:gcd(a,0)=a; gcd(a,b)=gcd(b,a mod b); gcd(a,b)=gcd(b,a); 1,质因数分解求GCD 先将a和b质因数分解。 得到 a=∏P i a i b= ∏P i b i gcd(a,b)=∏P i min(a i ,b i ) 2,辗转相除法求GCD 利用性质:gcd(a,b)=gcd(b,a%b); gcd(a,0)=a; 1 inline void gcd(int a,int b) 2 { 3 if(b==0) return a; 4 return gcd(b,a%b); 5 } 若gcd(a,b)=1,则称a,b互质。 求n的正约数集合:试除法 求1-n每个数的正约数集合:倍数法,类似于埃氏筛不同的是不是只用质数筛,是用每个数都筛一遍。 倍数:若a,b为正整数,d为非负整数,若a|d,b|d,则称d为a,b的倍数。 最小公倍数(LCM):a,b的所有公倍数中最小的那个。 LCM(a

AcWing 220. 最大公约数 | 欧拉函数

房东的猫 提交于 2019-11-27 15:11:52
传送门 题目描述 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。 GCD(x,y)即求x,y的最大公约数。 输入格式 输入一个整数N 输出格式 输出一个整数,表示满足条件的数对数量。 数据范围 1≤N≤10^7 输入样例: 4 输出样例: 4 题解: 本题要求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)数量,相当于求:对于N以内的每一个素数p,1<=x,y<=N/p 中GCD(x,y)为1的数对(x,y)数量和。我们知道欧拉函数的定义是1~n中与n互质的数的个数,那么对于p,1<=x,y<=N/p 中GCD(x,y)为1的数对(x,y)数量为φ(1)+φ(2)...+φ(N/p),可以用前缀和计算。要注意:x,y大小关系无影响所以要*2,但x,y相同时只算一次所以要-1。 题目就变成了求 \[\sum_{p是素数}^{p≤n} 2*\sum_{i=1}^{n/p}φ(i) -1\] 也可以用 \[\sum_{p是素数}^{p≤n} 2*\sum_{i=2}^{n/p}φ(i) +1\]。      代码: #include <bits/stdc++.h> using namespace std; #define ll long long const int N = 1e7 + 10; int v[N],prime[N]; ll

C++7行代码实现求最大公约数

南楼画角 提交于 2019-11-27 12:30:22
最近在做奥赛题时碰到求最大公约数的问题,给出解决方案: int gcd(int a,int b){ int tmp = a%b; if(tmp == 0){ return b; } else{ return gcd(b,tmp); } } 使用递归的方法能有效缩短代码长度,达到目的。 欧几里德算法又称 辗转相除法 ,是指用于计算两个 正整数 a,b的 最大公约数 。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。算法是用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。贴张图: 来源: https://www.cnblogs.com/lyj00912/p/11363135.html

区间最大公约数

北战南征 提交于 2019-11-27 10:35:34
题目链接 题意:给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:    1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。    2、“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。    对于每个询问,输出一个整数表示答案。 思路:因为更相减损数gcd(x,y)=gcd(x,y-x),而且正负不影响,所以可以维护A[i]数组的差分的线段树。当进行操作C时,既把A[l]加d,把A[r+1]减d。 然后当进行Q操作时,因为C操作的改变,所以就把[l+1,r]的线段树值求出来,与A[l]进行gcd。求A[l]就可以维护一个树状数组的区间操作,就能够得 到A[i]的值,即可求出答案。注意这题long long。 #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cstdio> #include<cmath> #define ll long long #define lowbit(x) x&(-x) using namespace std; const int N=5e5+100; struct point { ll l; ll r; ll dat; }t[N*4

1040 最大公约数之和 ,GCD (X, Y) == Z 等价于 GCD (X/Z, Y/Z) == 1

爱⌒轻易说出口 提交于 2019-11-27 10:18:24
1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N(N <= 10^9) 输出 公约数之和 输入样例 6 输出样例 15 知识点: 1、与n的公约数,肯定是n的因子 2、那么我们枚举因子x就好了,显然这个因子的对答案的贡 献就是gcd(n,i)=x的个数 3、gcd(n,i)=x的个数,就是gcd(n/x,i/x)=1的个数,那么就是求phi(n/x) 代码实现: #include <iostream> #include <string.h> #include <math.h> #include <ctime> #include <bits/stl_algo.h> #include <stdio.h> #include <algorithm> #define LL long long #define INF 0x3f3f3f3f #define ull unsigned long long using namespace std; const int N = 2e5 + 100; int sol_phi (int x) { int res = x; for (int i = 2; i * i <= x; i ++) { if (x%i

AcWing 246. 区间最大公约数

十年热恋 提交于 2019-11-27 09:40:56
传送门 题目描述 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。 2、“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。 对于每个询问,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行表示M条指令,每条指令的格式如题目描述所示。 输出格式 对于每个询问,输出一个整数表示答案。 每个答案占一行。 数据范围 N ≤ 500000 , M ≤ 100000 输入样例: 5 5 1 3 5 7 9 Q 1 5 C 1 5 1 Q 1 5 C 3 3 6 Q 2 4 输出样例: 1 2 4 题解: 线段树用于在区间上进行信息统计,这题求区间GCD显然可以用线段树来做。同时题目还需要区间更新。    我们知道gcd(x,y) = gxd (x,y-x)。它可以进一步扩展到三个数的情况:gcd(x,y,z) = gcd(x,y-x,z-y)。因此我们可以构造一个长度为N的新数列B,其中B[i] = A[i] - A][i-1]。数列B为A的差分序列。用线段树维护序列B的区间GCD就相当于维护A的区间GCD。这样一来询问[l,r]的GCD就相当于求gcd(A[l],B[l+1,r]的gcd),更新[l,r

[JSOI2015]最大公约数

﹥>﹥吖頭↗ 提交于 2019-11-27 05:45:57
题目 一个非常众所周知的结论,一个序列的前缀 \(\gcd\) 只会有 \(\log\) 种取值 于是考虑一下一些暴力的东西,我们枚举每个点作为左端点,二分出前缀 \(\gcd\) 变化的位置,复杂度大概是 \(\operatorname{O(nlog^3n)}\) ,好像非常垃圾的样子 我们考虑直接从后往前枚举左端点,每次往前加入一个数,和之前的前缀 \(\gcd\) 再取一个 \(\gcd\) 就好了,同时合并掉相同的一段 复杂度是 \(\operatorname{O(nlog^2n)}\) ,还是挺丢人的 代码 #include<bits/stdc++.h> #define re register #define LL long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline LL read() { char c=getchar();LL x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3ll)+(x<<1ll)+c-48,c=getchar();return x; } const int maxn=1e5+5; LL gcd(LL a,LL b) {return !b?a:gcd

G - GCD and LCM 杭电

谁都会走 提交于 2019-11-27 04:41:38
Given two positive integers G and L, could you tell me how many solutions of (x, y, z) there are, satisfying that gcd(x, y, z) = G and lcm(x, y, z) = L? Note, gcd(x, y, z) means the greatest common divisor of x, y and z, while lcm(x, y, z) means the least common multiple of x, y and z. Note 2, (1, 2, 3) and (1, 3, 2) are two different solutions. InputFirst line comes an integer T (T <= 12), telling the number of test cases. The next T lines, each contains two positive 32-bit signed integers, G and L. It’s guaranteed that each answer will fit in a 32-bit signed integer.OutputFor each test case,

LightOJ - 1341 Aladdin and the Flying Carpet 唯一分解定理LightOJ 1220Mysterious Bacteria

扶醉桌前 提交于 2019-11-26 19:12:43
题意: t t t 组数据,第一个给定飞毯的面积为 s s s ,第二个是毯子的最短的边的长度大于等于这个数,毯子是矩形但不是正方形。 思路: 求出 s s s 的所有因子,因为不可能是矩形,所以可以除以 2 2 2 ,最后暴力求出最短边长以内的因子,相减得出答案。 想 要 求 出 s 以 内 的 因 子 数 量 , 就 用 到 了 唯 一 分 解 定 理 , 先 求 素 数 想要求出s以内的因子数量,就用到了唯一分解定理,先求素数 想 要 求 出 s 以 内 的 因 子 数 量 , 就 用 到 了 唯 一 分 解 定 理 , 先 求 素 数 唯一分解定理: 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1 a1 P2 a2 P3 a3 … Pn an ,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式 (1)一个大于1的正整数N,如果它的标准分解式为:N=P1 a1 P2 a2 P3 a3 … Pn an ,那么它的正因数个数为 sum=(1+a1) (1+a2) (1+a3) … (1+an)。 (2) 它的全体正因数之和为 (1+p1 1 +p1 2 +…+p1 a1 )(1+p2 1 +p2 2 +…+p2 a2 ) … (1pn 1 +pn 2 +…+pn an )。 L i g h t