POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。
因为是同余,所以就是(x+mT)%L-(y+nT)%L=0。可以写成(x-y+(m-n)T)%L=0。就是这个数是L的倍数啦。那么我可以这样x-y+(m-n)T + Ls = 0。就可以了,s可正可负,就能满足条件。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
LL gcd(LL n,LL m)
{
if (n%m==) return m;
else return gcd(m,n%m);
}
LL exgcd (LL a,LL mod,LL &x,LL &y)
{
//求解a关于mod的逆元
if (mod==)
{
x=;y=;
return a;//保留基本功能,返回最大公约数
}
LL g=exgcd(mod,a%mod,x,y);
LL t=x; //这里根据mod==0 return回来后,
x=y; //x,y是最新的值x2,y2,改变一下,这样赋值就是为了x1=y2
y=t-(a/mod)*y; // y1=x2(变成了t)-[a/mod]y2;
return g; //保留基本功能,返回最大公约数
}
LL get_min_number (LL a,LL b,LL c,LL &x,LL &y)
{
//得到a*x+b*y=c的最小整数解
LL abGCD = gcd(a,b);//系统gcd
if (c%abGCD != ) return -;//无解
a /= abGCD; b /= abGCD; c /= abGCD;
LL tx,ty;
exgcd(a,b,tx,ty); //先得到a*x+b*y=1的解,注意这个时候gcd(a,b)=1
x = tx*c; y = c*ty;//任意一个解,就是因为你求的是a*x+b*y=1的解,但是我们需要的是a*x+b*y=c的解,所以同时乘上c
//然后这个方程的解就是x0=tx*c+b*k,y0=ty*c-a*k。这里的a和b约简了的。k是{-1,-2,0,1,2}等
LL temp_x = x;
x %= b; if (x<=) x += b;//最小解
LL k = (temp_x-x)/b;
y += k*a;
return ;//1代表可以
}
void work ()
{
LL x,y,n,m,L;
cin>>x>>y>>m>>n>>L;
LL a=m-n;
LL b=L;
LL c=y-x;
LL tx,ty;
LL t = get_min_number(a,b,c,tx,ty);
if (t==-)
{
cout<<"Impossible"<<endl;
return ;
}
if (b<) b=-b;
while(tx<) tx += b;
cout<<tx<<endl;
return ; }
int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
work();
return ;
}
★、求解方程ax+by=c的最小整数解 (a或者b是负数的话,直接放进去也没问题)
首先就是如果要求解ax+by=c的话,用exgcd可以求到ax+by=1的x,y。那么我们首先把a和b约成互质的(除以gcd(a,b)即可),求到Ax+By=1的x和y后,但是我们要的是Ax+By=C的解,所以同时乘上C,这里的大写的字母是代表约去gcd(a,b)后的方程。然后这个方程的解就是x0=tx*C+B*k。y0=ty*C-A*k。k是{-1,-2,0,1,2}等。
int get_min_number (int a,int b,int c,int &x,int &y) //得到a*x+b*y=c的最小整数解
{
int abGCD = gcd(a,b);
if (c%abGCD != 0) return -1;//无解
a /= abGCD; b /= abGCD; c /= abGCD;
int tx,ty;
exgcd(a,b,tx,ty); //先得到a*x+b*y=1的解,注意这个时候gcd(a,b)=1
x = tx*c; y = c*ty; //同时乘上c,c是约简了的
int temp_x = x;
x %= b; if (x<=0) x += b;//最小解
int k = (temp_x-x)/b;
y += k*a;
return 1;//1代表可以
}
若要得到最小的正整数解。注意这里要先判定他们是否存在解,不然TLE。
int bb=abs(b/gcd(a,b));
int aa=abs(a/gcd(a,b));
while(x<0) x += bb;
while(x*a+b*y!=c) y += aa;
POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。的更多相关文章
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德
POJ 1061 青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Descr ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- POJ 1061 青蛙的约会【扩展欧几里德】
设跳的次数为t 根据题意可得以下公式:(x+mt)%L=(y+nt)%L 变形得 (x+mt)-(y+nt)=kL (n-m)t+kL=x-y 令a=(n-m),b=L,c=x-y 得 at+bk=c ...
- POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]
先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- POJ 1061 青蛙的约会(exgcd)
嗯... 题目链接:http://poj.org/problem?id=1061 两只青蛙相遇时肯定满足:x+k*m≡y+k*n(mod L) x+k*m-(y+k*n)=L*s k*(n-m)-s* ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- Poj 1061 青蛙的约会(扩展GCD)
题目链接:http://poj.org/problem?id=1061 解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分 ...
随机推荐
- JS---script的位置
都可以,但各有千秋.放在head中:统一管理,方便维护:但浏览器会首先加载js文件,如果js文件过大,会造成页面在加载js的时候“无反应”时间过长,影响用户体验.放在body中(或放在body后):浏 ...
- idea崩溃导致的svn插件丢失问题, maven dependencies视图丢失问题
Idea丢失Svn解决办法 今天打开Idea,习惯用ctrl+t来更新svn,杯具出现了,快捷键失效了,我觉得可能是其他的什么软件占用了这个快捷键,于是重启了一下,发现还是不行,svn信息怎么没了,c ...
- Flask17 Flask_Script插件的使用
1 什么是Flask_Script 可以对flask应用做一些统一的操作 flask_script官网:点击前往 2 安装flask_script pip install -i https://pyp ...
- java高并发前言
- 8、泛型程序设计与c++标准模板库2.4列表容器
列表容器主要用于存放链表,其中的链表是双向链表,可以从任意一端开始遍历.列表容器是需要按顺序访问的容器.另外,列表容器不支持随机访问迭代器,因此某些算法不能适合于列表容器.列表容器还提供了另一种操作- ...
- 第5季-小试牛刀-项目开发\阶段2-新手上路\项目-移动物体监控系统\Sprint0-产品设计与规划
lesson1---产品功能展示 先完成准备阶段,准备阶段要做的事情: a.项目经理选择团队, b.根据项目用户需求以及同类型的实物,制定产品功能列表 c.根据功能的难易程度,制定迭代周期以及在每周期 ...
- 使用IDEA编译netty4
本来计划一天一篇博文的,结果周末加班加的不亦乐乎,对整个项目重构添加国际化的功能,不停的使用native2ascii工具 使用IDEA编译原有的netty4要报错,我修改了下pom.xml,编译成功了 ...
- 介绍一款“对话框”组件之 “artDialog”在项目中的使用
在实际开发项目中经常会用到对话框组件,提示一些信息.其实有很多,例如:在项目中常用到的“Jquery-UI.Jquery-EasyUI”的.Dialog,他们也很强大,Api文档也很多.今天就介绍一款 ...
- 第一个Python工程
创建你的第一个Python程序 如果你曾经很熟悉visual studio的工作方式.可能对python不习惯. 工程通常只与你使用的IDLE有关系.这些工具习惯将文档,编译,测试集成一体.所以就存在 ...
- Redis源码分析-底层数据结构盘点
前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...