POJ1061(线性同余方程)
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 105587 | Accepted: 20789 |
Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
扩展欧几里得求不定方程:ax+by=gcd(a,b)的解.不定方程 ax+by=c。若gcd(a,b)不能整除c,那么不定方程无解。
代码一:
#include <cstdio>
using namespace std;
typedef long long LL;
LL extgcd(LL a,LL b,LL &x,LL &y)
{
LL d=a;
if(b!=)
{
d=extgcd(b,a%b,y,x);
y-=(a/b*x);
}
else
{
x=;y=;
}
return d;
}
LL s1,s2,v1,v2,l;
int main()
{
while(scanf("%lld%lld%lld%lld%lld",&s1,&s2,&v1,&v2,&l)!=EOF)
{
LL a,b,c,x,y;
a=v1-v2;
b=l;
c=s2-s1;
if(a<) a+=l;
LL gcd=extgcd(a,b,x,y);
if(c%gcd!=)
{
printf("Impossible\n");
}
else
{
LL mod=b/gcd;
x=(x*(c/gcd))%mod;//注意扩大 c/gcd 倍
while(x<) x+=mod;
printf("%lld\n",x);
}
}
return ;
}
代码二:
#include <iostream>
using namespace std;
typedef __int64 LL;//int前双'_'
LL extgcd(LL a,LL b,LL &x,LL &y)
{
LL d=a;
if(b!=)
{
d=extgcd(b,a%b,y,x);
y-=(a/b*x);
}
else
{
x=;y=;
}
return d;
}
LL gcd(LL a,LL b)
{
if(b==) return a;
else return gcd(b,a%b);
}
LL s1,s2,v1,v2,m;
int main()
{
while(cin>>s1>>s2>>v1>>v2>>m)
{
//两者相遇的条件 s1+v1*t=s2+v2*t-k*m => (v1-v2)*t+m*k=s2-s1
//得线性同余方程 ax+by=c (a:v1-v2,x:t,b:m,k:y,c:s1-s1)
LL a=v1-v2;
if(a<) a+=m;
LL b=m;
LL c=s2-s1;
if(c<) c+=m;
LL div=gcd(a,b);
if(c%div!=) //同余方程ax+by=c.有解的充要条件是 c|gcd(a,b).
{
cout<<"Impossible"<<endl;
continue;
}
a/=div;//将各个系数均缩小div倍
b/=div;//ax+by=c => a'x+b'y=c'
c/=div;
LL x=,y=;
extgcd(a,b,x,y);//求解线性同余方程 ax+by=1
x=(x*c)%b;//扩展欧几里得求的是ax+by=1中的x,结果需要将x扩大c倍
while(x<) x+=b;
cout<<x<<endl;
}
return ;
}
java版
import java.util.Scanner;
import static java.lang.System.out;
public class Main{
static Scanner in = new Scanner(System.in);
static long s1,s2,v1,v2,l;
static class LL{
private long value;
public LL(long value)
{
this.value=value;
}
public long getValue()
{
return this.value;
}
public void setValue(long value)
{
this.value=value;
}
}
static long extgcd(long a,long b,LL x,LL y)
{
long d=a;
if(b!=0)
{
d=extgcd(b,a%b,y,x);
long buf = y.getValue();
buf-=(a/b*x.getValue());
y.setValue(buf);
}
else
{
x.setValue(1);y.setValue(0);;
}
return d;
}
public static void main(String args[]){ while(in.hasNext())
{
s1=in.nextLong();
s2=in.nextLong();
v1=in.nextLong();
v2=in.nextLong();
l=in.nextLong();
long a=v1-v2,b=l,c=s2-s1;
if(a<0) a+=l;
LL x = new LL(0),y = new LL(0);
long div=extgcd(a,b,x,y);
if(c%div!=0)
{
out.println("Impossible");
continue;
}
long mod=b/div;
long res=x.getValue();
res=(res*(c/div))%mod;//最小正整数解
while(res<0)
res+=mod;
out.println(res);
}
}
}
POJ1061(线性同余方程)的更多相关文章
- POJ1061 青蛙的约会(线性同余方程)
线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解. 这一题假设青蛙们跳t次后相遇,则可列方程: $$ Mt+X \equiv Nt+Y \pmod L$$ $$ (M ...
- 数论 - n元线性同余方程的解法
note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m ...
- POJ2115 C Looooops(线性同余方程)
无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} ...
- POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)
分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转 ...
- poj2115-C Looooops -线性同余方程
线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...
- 扩展欧几里得,解线性同余方程 逆元 poj1845
定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...
- POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]
先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...
- HDU3579:Hello Kiki(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...
- HDU1573:X问题(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题 ...
随机推荐
- 20145230《java学习笔记》第九周学习总结
20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...
- 谈Swift中的访问控制
访问控制(Access Control) 访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别.这个特性可以让我们隐藏代码的一些实现细节,并且可以指定一些代码和访问和使用的优先接口. 你可以明 ...
- iOS_触摸事件与手势识别
目 录: 一.触摸事件 1.1iOS的输入事件 1.2 触摸事件的处理 1.3 UITouch类中包含五个属性 1.4 UITouch类中包含两个成员函数 1.5响应者链 二.手势识别 2.1使用手 ...
- 查看git安装目录
有时候需要知道Git在电脑中的安装位置,这里简单介绍下: Mac平台:在命令行中输入which git, 就会显示git的安装位置了; Windows平台:打开cmd,输入where git就会显示g ...
- redis集群使用Java工具类(Java jedis集群工具类)
package com.xiaomi.weather.vote.webservices.util.redisCache; import com.google.common.base.Strings; ...
- 先有Class还是先有Object?
先有Class还是先有Object? Java的对象模型中: 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例. 所有的类都最终继承自Object类,Cla ...
- PrepareStatement
import java.sql.DriverManager; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- postgresql查看数据库占用的物理存储空间大小
1.手动查看: 查看数据库postgres的oid postgres=# SELECT oid from pg_database where datname='postgres'; oid------ ...
- 本地的html服务
本地的调试的时候, 我们服务器返回的cookie就会变的失效,因为你的本地服务器的域名不太对.
- hdu 5244 inverse(分治¥)
inverse Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...