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了,无语. 这题 ...
随机推荐
- Python 条件判断语句(if ,elif, else)
条件判断可以分: 单分支判断:只有一个if语句 双分支判断:if else 的格式 多分支判断:if elif else 的格式 条件语句嵌套判断 # 下面是个条件多分支判断 score = 85 ...
- Windows批量添加和删除IP
随着天气变冷了,好多小伙伴都开始变懒了,都想用最快的方式完成任务 下面给大家介绍一下Windows批量添加和删除IP的办法 (1)批量添加IP 直接在CMD下边运行下边命令. for /l %i in ...
- springmvc拦截器基本使用
1.HandlerExecutionChain是一个执行链,当用户的请求到达DispatcherServlet的时候,DispatcherServlet会到HandlerMapping中查找对应的Ha ...
- mysql基础(4)-数据导入
如何把数据导入(出)mysql 导出 sql语句 select * from 表名 into outfile "详细路径" fields terminated by ...
- QT 中文乱码问题
1. 在main函数中创建完 QApplication对象后马上添加 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8&qu ...
- node操作mongdb的常用函数示例
node操作mongdb的常用函数示例 链接数据库 var mongoose = require('mongoose'); //引用数据库模块 mongoose.connect('mongodb:// ...
- 数据链路层--PPP协议
数据链路层使用的信道主要有两种类型:点对点信道和广播信道. 点对点 路由器在转发分组时只使用了下面的三层. 链路是从一个结点到相邻结点的一段物理线路,中间没有其他交换结点. 必须有一些必要的通信协议来 ...
- ComboBoxStyle和ToggleButton
<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}"> <Setter ...
- winform中DataGridView使用DataGridViewCheckBoxColumn实现RadioBox单选功能
private void dgvMaterial_CellContentClick(object sender, DataGridViewCellEventArgs e) { ; i < dgv ...
- canvas基础学习(三)
一.图片加载控件 在canvas效果制作中常常要使用多张图片,为了提高用户体验,需要给用户提供一个图片加载中的过度页面效果.过度效果,我在项目中使用的是Sonic.js,它在git上的地址为https ...