整除也是一片新天地呢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=∏Piai
b=∏Pibi
gcd(a,b)=∏Pimin(ai,bi)
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,b)=a*b/gcd(a,b);
LCM(a,b)=a*gcd(a,b)/b;
1 inline int gcd(int a,int b) 2 { 3 if(b==0) return a; 4 return gcd(b,a%b); 5 } 6 7 inline int lcm(int a,int b,int ans) 8 { 9 ans=(a/gcd(a,b))*b; 10 return ans; 11 }