gcd

数论集合

你说的曾经没有我的故事 提交于 2019-11-27 13:57:25
零,前言: 学chty_sqy开个数论集合 学OI的时候以看数论就头大,现在该还了 T_T 建议推导和证明不熟或不会的同学动手推导 而且公式看上去不太清楚,学习的同学请仔细阅读 以前数论怎么都学不会,主要还是浮躁,不仔细看,没有动手 orz 一,gcd(欧几里得算法): 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b) => a=m*d,b=n*d 则m*d=t*n*d+a%b => a%b=d*(m-t*n) gcd(b, a%b)=gcd(n*d, (m-t*n)*d) 令gcd(n, m-t*n)=e => n=x*e,m-t*n=y*e 则m-x*e*n=y*e => m=e*(x*n+y) 由gcd(n, m)=1知gcd(e*(x*n+y), e*x)=1 故e=1 故gcd(n*d, (m-t*n)*d)=d即gcd(b, a%b)=gcd(a, b) 3.边界: 当b=0时return a 可以视为gcd(a, 0)=a,任何数都能整除0 也可以视为gcd(a, b)=b,这里的a和b是上一层的,满足a%b=0 4.特殊情况: 当a<b时,a%b=a,所以在下一层gcd(b, a%b)中相当于把a与b交换 5.代码: 1 int gcd(int a,int b){

退役后做题记录

此生再无相见时 提交于 2019-11-27 13:46:40
退役后做题记录 我退役了 AGC030E Less than 3 神仙题Orz 首先,如果你修改了一个位置 \(i\) ,那么 \(i-1\) , \(i+1\) 一定不同,否则一定会出现连续三个一样的 将0和1之间插入一条红线,1和0之间插入一条蓝线。那么红蓝线一定交替出现 修改相当于移动一条线,移动方案相当于一个匹配(位置1以前、位置n以后可以看做有无数条红蓝交替的线) 最妙的是,“不能出现连续三个一样的”限制没有了(因为一定能找到方案) 枚举匹配的方案即可 https://atcoder.jp/contests/agc030/submissions/6933519 AGC029B Garbage Collector 首先,取垃圾的代价固定,为 \(nX\) ,可以无视。 设取了 \(K\) 次垃圾,放垃圾代价就会是 \(KX\) 。 考虑一次取垃圾的过程,取了 \(x_1<x_2<\ldots<x_s\) 处的垃圾。 显然一定会先走到 \(x_s\) ,然后返回途中收辣鸡。 推一下,代价会是 \(5x_s+5x_{s-1}+7x_{s-2}+9x_{s-3}+\ldots+(2s+1)x_1\) 。 收了 \(K\) 次辣鸡,会有 \(2K\) 个系数 \(5\) , \(K\) 个系数 \(7,9,11,\ldots\) ,可以任意乘给 \(x\) 显然最大的 \(2K\)

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:45:57
基础数论 声明 : 参考课件来自PoPoQQQ(虽然我不认识他),讲授来自Accelerator 整理就是我这个juruo做的 基础知识 gcd和lcm gcd(x,y),简记为(x,y),表示两个数的最大公约数 lcm(x,y),简记为[x,y],表示两个数的最小公倍数 设x=∏pi^ai,y=∏pi^bi 那么(x,y)=∏pi^min(ai,bi),[x,y]=∏pi^max(ai,bi) 由于min(ai,bi)+max(ai,bi)=ai+bi,故有(x,y) [x,y]=x y 同余公式 (a+b)%p = (a%p + b%p) %p (a-b)%p = (a%p - b%p) %p (a b)%p = (int)( (LL) (a%p) (b%p) % p ) 除法怎么办??? 看下面 乘法逆元 定义:对于任意x∈[1,p),若(x,p)=1,则存在唯一的正整数inv[x]∈[1,p)满足x*inv[x]≡1(mod p),我们称inv[x]为x在模p意义下的逆元。 a/x=a* 1/x=a*inv[x] (mod p) 这说明,当我们需要除掉x的时候,我们只需要乘上x的逆元就行了。 求乘法逆元 扩展欧几里得(exgcd 用途:求出方程ax+by=gcd(a,b)的一组解,其中a和b已知,x和y未知 模仿欧几里得算法,假设我们得到了一组解x2和y2满足: b* x2

欧拉函数——POJ-2480

杀马特。学长 韩版系。学妹 提交于 2019-11-27 08:30:21
题目链接 题目要你求sigma gcd(i,N)  1<=i<=N 首先要知道一个式子gcd(i,N)=p => gcd(i/p,N/p)=1 以N=12举例 gcd=1的个数就是与12互质的数字的个数,也就是12的欧拉函数值,12与1,5,7,11的gcd gcd=2的个数包含了12/2=6的欧拉函数值,也就是12与2,10的gcd gcd=3的个数包含了12/3=4的欧拉函数值,也就是12与3,9的gcd 这样从i=1,i*i<=n,找到n%i==0的所有i*euler(n/i)就已经找到了大部分的gcd了 剩下的则是有gcd包含了几个素数相乘 可以知道gcd(i,N)全部都是N的因子,公约数嘛 这些因子有些比√n大,有些比√n小 通过之前的式子,我们的思路是找到N所有可能的gcd=P,累加P*euler(N/P) 在我们循环i=1,i*i<=n 找到N%i==0的过程中,找到的这个i因子是小等于√N的 但是如果i*i<N,那么N/i 一定大于√N并且也是N的因子 所以循环里找到这些对应有两个因子的i 进行累加 题目代码 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long LL; LL euler(LL n){ LL ans=n; for

拓展欧几里得算法求不定方程

心已入冬 提交于 2019-11-27 07:44:45
对于          ax+by=gcd(a,b) 这样的方程,可以用扩展欧几里得算法exgcd求出一组通解。 根据欧几里得求gcd:          gcd(a,b)=gcd(b,a%b) 可得          bx+(a%b)y=gcd(b,a%b) 根据       a%b=a−(a/b)∗b 可得          bx+ay−(a/b)b∗y=gcd(b,a%b) 化简得          ay+b(x−(a/b)y)=gcd(b,a%b)         x ′ = y , y ′ = ( x − ( a / b ) y )     a x ′ + b y ′ = g c d ( b , a % b ) < = > a x + b y = g c d ( a , b ) 根据       gcd(a,0)=a 一直递归直到b为0时可得       ax+by=a 可以得出一组平凡解            x=1,y=0 所以一直递归下去可以得出一组平凡解,然后再往回带得出ax+by=gcd(a,b)的一组解( x ′ = y , y ′ = ( x − ( a / b ) y ) ) 泛化来看不定方程 ax+by=c 只有满足 c%gcd(a,b)==0 才有解。 求解同余方程可以用费马小定理来求也可以用拓展欧几里得来求 ax≡b mod n <==>ax+ny

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,

CF926B Add Points

六月ゝ 毕业季﹏ 提交于 2019-11-27 03:14:45
~~一道尚未评定的水题~~ ### [更好的](https://fkx4-p.top)[阅读体验](https://www.cnblogs.com/H2SO4/) # 思路 来分析分析样例: ```cpp 3 -5 10 5 ``` ![](https://cdn.luogu.org/upload/pic/71475.png) 我们把它升序排列,会得到这个东西↑ ~~不~~仔细地观察后可以发现:加一个(0,0)的点显然是最优的 再~~用脚趾头~~想想为什么,我们发现,这题题意就是想让我们把一段线段x等分,使得给出的点都是它的x等分点。 而通过我们的~~敏锐的第六感~~做题经验,不难看出最优解即*相邻点距离的最大公约数* # 做法 显然此题难点在于求n个数的gcd 而要求多个数的gcd,两两求之后合并即可。 证明: 以三个数为例,设有a,b,c三数,x=gcd(a,b),y=gcd(x,c),因为a%x=0,x%y=0,所以a%y也等于零,且y是符合条件的最大值。 所以我们可以递推求n个长度的gcd,然后出解即可 # 代码 ```cpp #include <iostream> #include <cmath> #include <algorithm> using namespace std; int a[100001]; int b[100001]; int main() { int

正睿金华Day6数论&杂题选讲

Deadly 提交于 2019-11-27 03:13:39
<前言> 好久没写博客了,从Day5开始,那么我就从Day6开始补吧。 等等让我找找day6讲什么的、。。。 偶,是任轩笛讲的,上午讲数论和数论函数,下午杂题选讲。 <正文> 质因数 一开始讲的是质因数的素性测试、质因子分解之类的,听着还挺正常。讲到线性筛的时候感觉还行,就去上了个厕所回来。 素性测试: 试除法,配合质数筛法可以 O ( n ) O(\sqrt n) O ( n ​ ) 解决 这个只要筛出 n \sqrt n n ​ 之内的素数。然后一直试除,能除就除,只要能出就不是素数 Miller-Rabin素性测试, O ( l o g n ) O(log\ n) O ( l o g n ) 完成但可能错误。 这个我没听啊,但大致讲一下吧。 基本原理是费马小定理:若 p 是质数,a, p 互质,则 a p − 1 ≡ 1 ( &VeryThinSpace; m o d &VeryThinSpace; p ) a^{p-1} \equiv 1(\bmod\ p) a p − 1 ≡ 1 ( m o d p ) 于是对于某个 p,若能找到与它互质的 a 使得 a p − 1 ≠ 1 ( m o d p ) a^{p-1} \neq 1(mod\ p) a p − 1 ̸ ​ = 1 ( m o d p ) ,则p不是质数。 然而有一些合数 p,满足所有与它互质的 a 都有 a p

51nod 1594 Gcd and Phi

南楼画角 提交于 2019-11-27 01:03:55
OTZ 又被吊打了。。。我当初学的都去哪了??? 思路:反演套路? 提交: \(1\) 次 题解: 求 \(\sum_{i=1}^{n}\sum_{j=1}^{n}\varphi(gcd(\varphi(i),\varphi(j)))\) 设 \(c[i]=\sum_{j=1}^n[\varphi(j)==i]\) 有: \(\sum_{i=1}^{n}\sum_{j=1}^{n}\varphi(gcd(i,j))*c[i]*c[j]\) 欧拉反演一下,把 \(gcd\) 扔出来 \(\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{d|gcd(i,j)}\varphi(d)*c[i]*c[j]*[gcd(i,j)==d]\) $\sum_{d=1}^{n}\varphi(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} c[i*d] * c[j*d] * [gcd(i,j)==1] $ $\sum_{d=1}^{n}\varphi(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}c[i*d] \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}c[j*d] [gcd(i,j)=