gcd

俩分数相乘后约分的Cantor表(洛谷P1482题题解,Java语言描述)

我是研究僧i 提交于 2020-01-29 09:41:39
题目要求 P1482题目链接 分析 据说本题是 这题 的升级版…… → P1014题题解 升级的地方其实就是相乘之后约分。 约分需要求解最大公约数,gcd()是吧…… 但我这里偏偏懒得写gcd,就想用Java的API怎么办?嘿嘿,别找啦,在java.math.BigInteger里! public BigInteger gcd​(BigInteger val) 就是这个玩意,最后转回去就完事啦…… 更何况这题,竟然不是求位置标识,而是横纵坐标……这不显然的吗…… 约分后的分母是行,分子是列。 So……升级版??宁逗我?? 从橙题升级升到红题哈哈哈……自降一级……xswl…… AC代码(Java语言描述) import java . math . BigInteger ; import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) { Scanner scanner = new Scanner ( System . in ) ; String [ ] array_1 = scanner . nextLine ( ) . split ( "/" ) ; String [ ] array_2 = scanner . nextLine ( ) . split (

2020 CCPC Wannafly Winter Camp Day1 Div.1&2(H 最大公约数)(找规律+大整数乘法)

99封情书 提交于 2020-01-27 14:50:13
2020 CCPC Wannafly Winter Camp Day1 Div.1&2(H 最大公约数)(找规律+大整数乘法) 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 有三个人, A , B , C {A,B,C} A , B , C ,其中 A {A} A 和 B {B} B 共享了一个神秘的数字 k {k} k ,已知 1 ≤ k ≤ n 1 \leq k \leq n 1 ≤ k ≤ n 。 现在 A {A} A 和 C {C} C 说:“ k {k} k 的值等于 x {x} x ”。 C {C} C 不太信任 A {A} A ,于是想向 B {B} B 确认一下 k {k} k 是否真的等于 x {x} x 。 B {B} B 虽然不想直接把 k {k} k 的值告诉 C {C} C ,但是 B {B} B 允许 C {C} C 给出一个正整数 y {y} y (注意 y {y} y 可以大于 n {n} n ),然后 B {B} B 会回答 gcd ⁡ ( k , y ) \gcd(k,y) g cd ( k , y ) 。 现在给出 k , n {k,n} k , n ,你需要帮助 C {C} C 决定这样的 y {y} y 的取值,使得 C {C}

ACM.GCD与LCM

家住魔仙堡 提交于 2020-01-25 11:52:01
欧几里得算法 取模运算的运算规则 (a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a % p * b % p) % p a ^ b % p = ((a % p)^b) % p 又名辗转相除法 代码实现过程 1非递归写法 int gcd ( int a , int b ) { int r = a % b ; while ( r ) { a = b ; b = r ; r = a % b ; } return b ; } 2递归写法 int gcd ( int a , int b ) { return b ? gcd ( b , a % b ) : a; } 最小公倍数lcm(a,b)=a b/gcd(a,b) 最大公约数和最小公倍数的一些性质 gcd(a , b) = gcd(b , a-b) gcd(ma , mb) = m gcd(a , b), m为一个自然数 gcd(a+mb , b) = gcd(a , b) m=gcd(a , b) 则gcd(a/m,b/m)=gcd(a,b)/m gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c)) lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a,

扩展欧几里得算法

元气小坏坏 提交于 2020-01-22 20:33:10
裴蜀定理 对任何整数 \(a\) , \(b\) 关于未知数 \(x\) 和 \(y\) 的线性不定方程(称为裴蜀等式): \(ax+by=c\) 方程有整数解(当且仅当 \(c\) 是 \(gcd(a,b)\) 的倍数),裴蜀等式有解时必然有无穷多个解 即 \(ax+by=c\) 有解的充要条件为 \(gcd(a,b)|c\) 原方程的解即为 \(ax+by=gcd(a,b)\) 的解乘上 \(\frac{c}{gcd(a,b)}\) 扩欧解出的 \(x\) 为 \(ax+by=gcd(a,b)\) ,中的 \(x\) ,若要求 \(ax+by=c\) 中的 \(x\) ,两边还要乘上 \(\frac{c}{gcd(a,b)}\) 推论: \(a\) , \(b\) 互素等价于 \(ax+by=1\) 有解 计算其中整数 \(x\) 和整数 \(y\) 的计算方法被称为扩展欧几里得算法 \(code :\) int exgcd(int a,int b) { if(!b) { x=1,y=0;//x,y设为全局变量 return a;//若为void,此处直接return } int ans=exgcd(b,a%b),tmp=x; x=y,y=tmp-a/b*y; return ans;//得到的为gcd(a,b) } 由欧几里得算法,得 \[ax+by=gcd(a,b)=gcd

欧几里得算法

[亡魂溺海] 提交于 2020-01-20 23:50:10
欧几里得算法又称辗转相除法,用于计算两个正整数的最大公约数。 gcd(a,b) = gcd(b,a%b) int gcd(int a, int b) { return b? gcd(b, a % b) : a; } 拓展欧几里得算法 void gcd(int a, int b, int &d, int &x, int &y){ if(!b) d = a, x = 1, y = 0; else gcd(b, a % b, d, y, x),y -= x * (a / b); } 来源: https://www.cnblogs.com/nioh/p/12219813.html

最大公约数问题

牧云@^-^@ 提交于 2020-01-20 16:48:25
最大公约数问题 题目描述 如何求两个正整数的最大公约数? 思路 暴力枚举法 没什么好说的,直接看代码 //暴力枚举法 public static int gcd1 ( int a , int b ) { int big = a > b ? a : b ; int small = a < b ? a : b ; if ( big % small == 0 ) { return small ; } for ( int i = small / 2 ; i > 0 ; i -- ) { if ( small % i == 0 && big % i == 0 ) { return i ; } } return 1 ; } 辗转相除法 基于定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数 基于这条定理,我们利用递归法就可以解决问题 //辗转相除法 public static int gcd2 ( int a , int b ) { int big = a > b ? a : b ; int small = a < b ? a : b ; if ( big % small == 0 ) { return small ; } return gcd2 ( big % small , small ) ; } 更相减损术 原理:两个正整数a和b(a>b)

gcd(a,b)和exgcd(a,b,x,y)

瘦欲@ 提交于 2020-01-19 20:25:23
gcd(a,b)和exgcd(a,b,x,y) gcd() : int gcd(int a,int b) { if(b) return gcd(b,a%b); else return a; } 当然也可以使用头文件 <algorithm> 自带的函数 __gcd(a,b) exgcd(a,b,x,y) : int exgcd(int a,int b,int &x,int &y) { int gcd; if(b){ gcd=exgcd(b,a%b,y,x); y-=a/b*x; } else gcd=a,x=1,y=0; return gcd; } 证明: 假设有 ① \(ax_1+by_1=gcd(a,b)\) ② \(a'x_2+b'y_2=gcd(a,b)\) 先假设②是在①的下面,也就是说,在递归顺序中②是先执行完的。 我们由 \(gcd(a,b)\) 的代码实现过程可以很容易得到: \(a'=b,b'=a\%b=a-a/b*b\) 代入②式得 \(bx+(a-a/b*b)y_2=gcd(a,b)\) ,整理一下, \(ay_2+b(x_2-a/b*y_2)=gcd(a,b)\) 跟①式进行对照,即可得出 \(\begin{cases}x_1=y_2\\y_1=x_2-a/b*y_2 \end{cases}\) 即得到了 \(x\) 和 \(y\) 的递推关系 来源:

2016 Multi-University Training Contest 1 solutions BY HIT

大憨熊 提交于 2020-01-19 10:38:35
首先向大家表示抱歉,因为这套题是去年出的,中间间隔时间太长,今年又临时准备仓促, 所以部分题目出现了一些问题,非常抱歉。 Abandoned country 首先注意到任意两条边的边权是不一样的,由此得知最小生成树是唯一的,最小生成树既然 是唯一的,那么期望其实也就是唯一的,不存在什么最小期望。求完最小生成树之后,接下 来的问题就可以转换成在最小生成树上求任意两点之间距离的平均值,对于每条边,统计所 有的路径用到此边的次数,也就是边的两端的点数之积。那么这条边的总贡献就是次数*边 权。最后得到所有边的贡献之和再除以总路径数 \(n*(n-1)/2\) 就是答案。可以 \(On\) 求出。任取一点为根dfs,对每个点 \(i\) 记录其子树包含的点数(包括其自身),设点数为 \(sum[i]\) ,则 \(i\) 的父亲一侧的点数即为 \(n-sum[i]\) 。一边遍历一边统计就行。 Chess 简单的博弈,要预处理出所有状态的Sg值,因为列为固定的20,所以状态压缩后可以存下 所有状态。 Game 题目要求出所有合法点对间的最短路径的平均值,因此我们应当求出所有合法最短点对的最 短路径之和,再除以合法点对个数。 题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行、列都不能有其余的 Guard,但不可路过的格子却只有本身一格。由此发现

【Exgcd】扩展欧几里得算法

柔情痞子 提交于 2020-01-18 18:20:22
Description    欧几里德算法 又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式 。    扩展欧几里德算法 是用来在已知a, b,求解一组 x,y 使得:ax + by = gcd(p,q) (解一定存在,根据数论中的相关定理)。    本题任务 :给定任意整数a,b,c,求方程 ax + by = c 的整数解,输出其中x是最小的正整数的一组。 Input   若干行,每行一组数据:a,b,c。他们都是int范围内的整数。 Output   每组数据输出一行,若给定方程没有整数解,输出"No solution",否则输出x是最小的正整数的一组。 Sample Input 1 1 1 1 1 2 1000 12 20 7 27 -45 18 6 15 9 Sample Output 1 1 0 2 499 No solution 4 2 4 -1 Hint a,b,c在int范围内,且都不为0。 1.理论部分 欧几里得算法 求最大公因数: int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a%b); } 其中模运算可定义为:(以下除法都是指下取整除法) a%b = a-a/b*b 扩展欧几里得算法: 已知整数a、b

CF585E:Present for Vitalik the Philatelist

蹲街弑〆低调 提交于 2020-01-18 11:29:34
n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数。 好的统计题。 其实就是要对每个数求和他互质的,gcd不为1的集合数,容斥一下,求出所有gcd不为1的集合数A然后减去所有他的质因子对这个A的贡献。(这里的A是CF的题解的B) 那先看看所有gcd不为1的集合数怎么求。比如说2的倍数有cnt_2个,那能凑出2^cnt_2-1个集合,然后3的倍数有cnt_3个,能凑出2^cnt_3-1个集合,但有一些gcd为6的集合被算了两次,就要减去2^cnt_6-1,等等这不是莫比乌斯函数嘛,所以现在只要统计1~1e7中每个数作为多少个数的因数即可。那要把n个数都进行分解,这里可以在筛莫比乌斯的时候记一下每个数的最小质因子就可以n*logMax的时间内完成所有数的分解。由于miu_i=0的cnt_i对答案没贡献,所以每个数分解完的质因子不用去考虑那些次数大于1的部分,比如12=2*2*3直接看2和3即可。把不重复质数分解出来后,在1e7内一个数最多有8个不同质因子,所以枚举一下所有这些质因子能凑出的数即可计算miu_i不为0的cnt_i。 然后某个数的质因子对A的贡献呢?同理耶! 1 #include<stdio.h> 2 #include<string.h> 3 #include