数论集合
零,前言: 学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){