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了,无语. 这题 ...
随机推荐
- INSPIRED启示录 读书笔记 - 第13章 产品原则
确定什么最重要 产品原则是对团队信仰和价值观的总结,用来指导产品团队作出正确的决策和取舍.它体现了产品团队的目标和愿景,是产品战略的重要组成部分.从形式上看,它是一系列明确的.体现团队特色的产品价值准 ...
- 暑假爆零欢乐赛SRM08题解
这真的是披着CF外衣的OI赛制?我怎么觉得这是披着部分分外衣的CF?果然每逢cf赛制必掉rating,还是得%%%cyc橙名爷++rp.. A题就是找一找序列里有没有两个连在一起的0或1,并且不能向两 ...
- Centos7 docker容器 搭建
Dockerfile 文件如下: # # MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com> # DOCKER-VERSION # # Dock ...
- Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)
创建一个topic ./kafka-topics.sh --create --zookeeper 192.168.1.244:2181,192.168.1.245:2181,192.168.1.246 ...
- VC数据类型
不同编码格式下的字符串处理及相互转化: ◆ 大家在编程时经常遇到的数据类型:● Ansi:char.char * .const char *CHAR.(PCHAR.PSTR.LPSTR).LPCSTR ...
- 循环插入一条数据的sql写法
DECLARE @i INTSET @i = 1WHILE @i > 0 BEGIN DECLARE @TransportFormMstID BIGINT; DECLARE @TradeOrde ...
- 比较好的sql写法
DECLARE @beginTime VARCHAR(20)= '2017-11-13 00:00:00';DECLARE @endTime VARCHAR(20)= '2017-11-13 23:0 ...
- 阿里云服务器windows server2008r2+tomcat8.0+nginx1.12
弄了两天的nginx,从了解开始,可能是我理解能力太差了,惭愧惭愧!但是还好看了一些大神的文章总算有点眉目了,此篇用来当作自己的笔记,大家看不懂,勿喷,但是如果有问题,直接回复,我可以给你解答一下,前 ...
- 安装Tomcat服务器以及错误汇总(tomcat8.0、jdk8)
Tomcat安装和启动 一.下载Tomcat 你可以直接百度Tomcat官网, 或者,直接在地址栏输入他的官网地址:http://tomcat.apache.org/,然后进入他的主页,在主页左侧可以 ...
- servlet中service() doGet() doPost() 方法
HttpServlet 里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletReque ...