简单的数论小知识
2017-10-28 16:45
204 查看
经过我这一段时间对数论的一顿乱学,现在总结几点最基础的吧.
1.gcd算法
gcd算法用来求最大公约数,最普遍且优美的算法就是辗转相除法。
int gcd(int a,int b){
if(b==0) {
return a;
}
else gcd(b,a%b);
}
(超简洁的)
而lcm(最小公倍数)就用(a*b)/gcd(a,b)
附录一个小知识,a%b=a-(a/b)*b (注意这个除号是整除)
2.拓展欧几里得 ExGcd
例子一个:求直线ax+by+c=0上有多少个整点(x,y)满足x∈(x1,x2),y∈(y1,y2)
从最基础开始求解ax+by=gcd(a,b)
ax+by=gcd(a,b)
bx1+(a%b)y1=gcd(a,b)
即bx1+[a-(a/b)b]=gcd(a,b)
b[x1-(a/b)y1]+ay1=gcd(a,b)
by+ax=gcd(a,b)
x=y1
y=x1-(a/b)*y1
“`
关系明显得出来了,代码也就可以轻松写出来了
int Exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int ans=Exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
1.gcd算法
gcd算法用来求最大公约数,最普遍且优美的算法就是辗转相除法。
int gcd(int a,int b){
if(b==0) {
return a;
}
else gcd(b,a%b);
}
(超简洁的)
而lcm(最小公倍数)就用(a*b)/gcd(a,b)
附录一个小知识,a%b=a-(a/b)*b (注意这个除号是整除)
2.拓展欧几里得 ExGcd
例子一个:求直线ax+by+c=0上有多少个整点(x,y)满足x∈(x1,x2),y∈(y1,y2)
从最基础开始求解ax+by=gcd(a,b)
ax+by=gcd(a,b)
bx1+(a%b)y1=gcd(a,b)
即bx1+[a-(a/b)b]=gcd(a,b)
b[x1-(a/b)y1]+ay1=gcd(a,b)
by+ax=gcd(a,b)
x=y1
y=x1-(a/b)*y1
“`
关系明显得出来了,代码也就可以轻松写出来了
int Exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int ans=Exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
相关文章推荐
- cf 645F Cowslip Collections 组合数学 + 简单数论
- HDU 1568 Fibonacci(简单数论)
- kuangbin简单数论(上)
- ACM模拟题详解(2)——简单数论
- HDU 2608 0 or 1 简单数论
- sgu 107 (简单数论)
- HDU1262:寻找素数对(简单数论)
- 组合数简单求法(数论)
- BZOJ 2186 [SDOI 2008]沙拉公主的困惑 简单数论
- hdu 5832 A water problem(简单数论)
- HDU 1124 Factorial(简单数论)
- HDU - 5974 A Simple Math Problem(简单数论)
- POJ 2826 An Easy Problem!(简单数论)
- POJ2635 The Embarrassed Cryptographer 简单数论
- 简单的数论题目zju1652(不知道有没有AC,因为我在zju上没帐号)PKU上没有
- 简单数论知识梳理(省选复习)
- (A^B)%C 快速幂乘 (简单数论)
- Codeforces Round #326 (Div. 2) B Duff in Love 简单数论 姿势涨
- PKU 2769 Reduced ID Numbers(简单数论)
- Codeforces 17D Notepad 简单的数论