一、欧几里得算法(最大公约数,最小公倍数)
又称辗转相除法,设a,b为整数,gcd(a,b)=gcd(b,a mod b);
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
//
int gcd(int a,int b){
return b? gcd(b,a%b):a;
}
最小公倍数lcm满足lcm*gcd=a*b
二、扩展欧几里得算法
定理:gcd(a,b)是a,b的最小正线性组合,即gcd(a,b)=a*x+b*y;
裴蜀定理:若ax+by = z,则 gcd(a,b)| z
问题:如何求x,y?
(以下讨论a>b)
显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
当a>b>0 时
设 ax1+ by1= gcd(a,b);
bx2+ (a mod b)y2= gcd(b,a mod b);
根据欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2 = ay2+ bx2- [a / b] * by2;(a mod b = a - [a / b]*b;[a / b]代表a整除b)
也就是ax1+ by1 = ay2 + b(x2- [a / b] *y2);
根据恒等定理得:x1=y2;y1=x2- [a / b] *y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2
由引理我们知道:ax+by = z,z为gcd(a,b)若干倍,所以我们先求解ax+by = gcd(a,b),再将求出的解乘以 z/gcd(a,b)就好了。
代码:
int x,y,d;//x,y是系数,d是最大公约数
void gcd(int a,int b,int& d,int &x,int& y){
if(b==0){
d=a;x=1;y=0;
}
else{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
但这对于不定方程ax+by=c只是求出了一个特解,之后对于x,y
X=x+(b/gcd)*t
Y=y-(a/gcd)*t
t为任意整数
如果要求X的最小正整数解
Xmin=(x%(b/gcd)+(b/gcd))%(b/gcd)
先模一次有可能是负值,所以加了(b/gcd)再模一次
POJ 1061青蛙的约会
三、素数的分布
π(x):小于等于x的素数个数
x很大时,π(x)近似为x/lnx
一个数为素数的概率大约是1/lnx
#include<cmath>
double log10(double)//以10为底
double log(double) //以e为底
注意:可以用lg求x的位数->[lg(x)]+1
四、素数的测试
定理:若n是合数,则必存在小于等于根号n的素因子
筛法:求一个范围内的所有素数,复杂度NloglogN
6N+-1法:除2,3以外,素数满足6N+-1
五、算数基本定理(唯一分解定理)
定理内容:任何一个大于1的自然数,都可以唯一分解成有限个质数的乘积
,这里
均为质数,其诸指数
是正整数。
确定n!分解式中指数的方法:
n!的分解式中素数p的幂指数:
[n/p]+[n/p/p]+[n/p/p/p]+...... `
例1:求n!末尾0的个数
由于n!中2因数个数肯定多于5的因数,所以只用求5的因数个数,套公式即可
例2:求C(2N,N)被p整除多少次
C(2N,N)=(2N)!/N!/N!,求(2N)!和N!中p的因数个数k1和k2,然后答案就是k1-2*k2
六、一些有关素数的特殊性质概念(待更新)
梅森素数,几个素数猜想
七、同余基本性质
第一组:已知a≡b(mod m),有整数c
a-c≡b-c(mod m)
a+c≡b+c(mod m)
ac≡bc(mod m)
第二组:已知a≡b(mod m),c≡d(mod m),x,y为任意整数
ax+cy≡bx+dy(mod m)
ac≡bd(mod m)
第三组:已知ac≡bc(mod m),且d=gcd(c,m)
a≡b(mod m/d)
第四组:
a≡a%m(mod m)
b≡b%m(mod m)
两式子加减乘依然同余,启发我们可以化大数的余数为先取模之后的小数的余数
POJ 2769 Reduced ID Numbers
八、线性同余方程(组)
①一元线性同余方程
POJ 2115 Looooops(前面青蛙的约会那道题已经充分使用了)
②方程组的解法
POJ 2891
HDU 1573
复习用题:HDU3579
九、高次同余方程(待补)
十、中国剩余定理(待补)
十一、二元一次不定方程
形式为ax+by=c
在a>0,b>0时,可以转化为一元线性同余方程ax≡c(mod b)
d=gcd(a,b),当d|c时,方程有解,且有无数解;否则,无解
对于方程的特解x,y,通解X,Y可以表示为
X=x+t*(b/d)
Y=y-t*(a/d)
十一、n元一次不定方程(待补)
十二、![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D82/sign=56bb2ed340a98226bcc126258b82ab45/5ab5c9ea15ce36d368462f9639f33a87e850b1d2.jpg)
费马大定理:当整数时,关于
的方程
没有正整数解
毕达哥拉斯三元组:正整数x,y,z满足:x^2+y^2=z^2
定理:正整数x,y,z构成毕达哥拉斯三元组且y为偶数,当且仅当存在互素的m,n(m>n且m,n一奇一偶)使得
x=m^2-n^2
y=2*m*n
z=m^2+n^2