菜鸟系列——欧几里德与扩展欧几里
2015-08-19 15:26
447 查看
菜鸟就要老老实实重新学起:
欧几里德算法:
就是辗转相除法,小学的东西,gcd(a,b)=gcd(b,a%b),实现简单,用途广泛,,
模版:
long long gcd(long long x,long long y) { return y?gcd(y,x%y):x; }
或者用迭代的写法:
long long gcd(long long x,long long y) { if(x<y)x^=y,y^=x,x^=y; long long t; while(y) t=y,y=x%y,x=t; return x; }
由gcd也就可以求出lcm:
long long lcm(long long x,long long y) { return x/gcd(x,y)*y; }
扩展欧几里德算法:
主要说这个,求解a*x+b*y+c=0的方程解,先求a*x+b*y=gcd(a,b),就是利用欧几里德算法gcd(a,b)=gcd(b,a%b).
所以a*x1+b*y1=gcd(a,b), b*x0+a%b*y0=gcd(b,a%b).有x1=y0.y1=x0-(a/b)*y0.
由此可求出解x,y。
由x1=x*(c/gcd(a,b)),y1=y*(c/gcd(a,b))求出原方程的一组解。
通解只要取x = x1+b/gcd(a,b)*k; y = y1-a/gcd(a,b)*k;就行了。
模版:
long long exgcd(long long a, long long b,long long &x,long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long g = exgcd(b, a % b ,x ,y); //x1=y2, y1=x2-a/b*y2 long long t = x - a / b * y; x = y; y = t; return g; //return gcd } long long solve(long long a,long long b,long long c) { long long x,y,x0,y0,x1,y1,t = exgcd(a,b,x0,y0); if(c%t!=0)return 0;// NO solution; // x = x0+b/t; y = y0-a/t; //通解 x1 = (x*c/t); y1 = (y*c/t);//求原方程的解 // x1 = (x0*c/t)%b; x1 = (x1%(b/t)+b/t)%(b/t);//取x的最小整数解; printf("%d %d\n",x1,y1); return 0; }
eg:
POJ1061 青蛙约会
http://poj.org/problem?id=1061题意:
给出一个环形路,两只青蛙的初始位置及跳一次的距离,求同向行动时相见的时间。思路:
可写出方程式:(x+m*t)-(y+n*t)=k*l.变换为:(n-m)*t+k*l=(x-y);
所以直接扩展欧几里德求出方程解即可。
code:
long long n,m,l; long long exgcd(long long a, long long b,long long &x,long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long g = exgcd(b, a % b ,x ,y); long long t = x - a / b * y; x = y; y = t; return g; } long long solve(long long a,long long b,long long c) { long long x,y,x0,y0,x1,y1,k,t = exgcd(a,b,x0,y0); if(c%t!=0) { printf("Impossible\n"); return 0;// NO solution; } x1 = (x0*c/t)%b; x1 = (x1%(b/t)+b/t)%(b/t); printf("%lld\n",x1); return 1; } int main() { long long i,j,k,kk,t,x,y,z; while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF) solve(n-m,l,x-y); return 0; }
相关文章推荐
- MySQL下载安装、配置与使用(win7x64/32)
- Java内存分配
- tomcat server.xml配置详解
- 静态测试和动态测试
- java连接数据库
- Java Mail 发送邮件 接收邮件
- Hadoop的伪分布安装 hadoop的核心思想
- uva10071-Back to High School Physics
- EasyUI combobox--给combobox绑定值
- SpringMVC -jquery实现分页
- 桌面支持--打印服务未启动--需要开启
- cplusplus 模板类学习笔记
- Spring 的两种定时器
- ZOJ 3703 Happy Programming Contest
- 硬件十万个为什么——运放篇(三)如何估算多级放大器的频宽
- 重定向
- 大端模式和小端模式
- struts2中的ActionContext
- 湘潭oj1203/邀请赛A称号 数论+java睑板
- ios7适配一些问题以及64位32位