洛谷 p1516 青蛙的约会 题解
dalao们真是太强了,吊打我无名蒟蒻
我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的)
进入正题
如果不会扩展欧里几德的话请先去做
洛谷 p1082 同余方程
设跳了k次
所以km - kn + x - y = 0(mod l)
所以k(m - n) + h * l = y - x
这个移项应该没问题吧
设(m - n)为a,k为x,h为y,
l为b,(y - x)为m
那么转换为ax + by = m
根据裴蜀定理ax + by = gcd(a,b)有解
但不代表ax + by = m无解
我们可以让等式两边同除一个m,再同乘一个gcd(a,b)
就成了ax / m * gcd(a,b) + by / m * gcd(a,b) = gcd(a,b)
把(x / m * gcd(a,b))作为新的x,(y / m * gcd(a,b))作为新的y
再利用扩展欧里几德可以求出新的x
即(x / m * gcd(a,b))
我们如果求出了(x / m * gcd(a,b)),那么也可以求出x(乘一个m再除一个gcd就好了)
但是这并不意味这每个方程都有解,因为我们的x代表的是k
也就是x代表跳的次数,所以仅可以作为整数
也就是如果我们必须让 m整除gcd(a,b)即m % gcd(a,b) == 0
如果m % gcd(a,b)不等于0,那么方程无解
#include<bits/stdc++.h>
using namespace std;
inline long long read(){long long s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
long long xx,yy,t,AC = 0;
long long gcd(long long x,long long y){//求gcd
if(y == 0) return x;
return gcd(y,x % y);
}
void exgcd(long long a,long long b){//正宗exgcd
if(b == 0){
xx = 1;
yy = 0;
return ;
}
exgcd(b,a % b);
t = xx;
xx = yy;
yy = t - a / b * yy;
}
int main()
{
long long x = read(),y = read();
long long m = read(),n = read();
long long l = read();
long long a = n - m,b = l,mm = x - y;
if(a < 0){//我们让第一只青蛙开始再第二只后面,如果不是这样就调换位置(~~因为青蛙是一样的~~)
mm = -mm;
a = -a;
}
long long g = gcd(a,b);
long long t = b / g;
if(mm % g){//不是0则无解
cout<<"Impossible"<<endl;
return AC;
}
exgcd(a,b);
long long ans = xx * (mm / g);//我以为答案就是这样
cout<<(ans % t + t) % t<<endl;//至于%t+t%t也是看了其他大佬的题解才知道的,不过我并不知道为什么,(太弱了,雾)
return AC;//返回AC保平安
}
洛谷 p1516 青蛙的约会 题解的更多相关文章
- 洛谷 P1516 青蛙的约会 解题报告
P1516 青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- 洛谷——P1516 青蛙的约会
P1516 青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- 洛谷P1516 青蛙的约会(扩展欧几里德)
洛谷题目传送门 很容易想到,如果他们相遇,他们初始的位置坐标之差\(x-y\)和跳的距离\((n-m)t\)(设\(t\)为跳的次数)之差应该是模纬线长\(l\)同余的,即\((n-m)t\equiv ...
- 洛谷P1516 青蛙的约会
题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清 ...
- 洛谷 P1516 青蛙的约会
https://www.luogu.org/problemnew/show/P1516#sub 题意还是非常好理解的..... 假如这不是一道环形的跑道而是一条直线,你会怎样做呢? 如果是我就会列一个 ...
- P1516 青蛙的约会和P2421 [NOI2002]荒岛野人
洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...
- 【题解】P1516 青蛙的约会(Exgcd)
洛谷P1516:https://www.luogu.org/problemnew/show/P1516 思路: 设两只青蛙跳了T步 则A的坐标为X+mT B的坐标为Y+nT 要使他们相遇 则满足: ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- P1516 青蛙的约会
P1516 青蛙的约会x+mt-p1L=y+nt-p2L(m-n)t+L(p2-p1)=y-x令p=p2-p1(m-n)t+Lp=y-x然后套扩欧就完事了 #include<iostream&g ...
随机推荐
- python3 四舍五入(0.5可以进1)
今天做了一个题要求四舍五入,然后找了一个方法:round()可以四舍五入, 试了试1.5--->2 试了试0.5--->0 !!!! 找了几个方法说可以的: # 方法一: from _ ...
- iptables 【转载】
一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...
- 基于 Ubuntu 系统安装 CUDA 和 cuDNN
************************************************ 显卡:GTX 1050Ti 系统:Ubuntu 18.0.4 安装的CUDA:10.0 版本 **** ...
- .NET[C#]使用LINQ从List<T>集合中获取最后N条数据记录的方法有哪些?
https://codedefault.com/2018/using-linq-to-get-the-last-n-elements-of-a-collection-in-csharp-applica ...
- C# 打开mpp文件(Microsoft object)问题总结
有需求就有解决方案,早上还没有听说过什么是 mpp 文件,下午已经能成功的将功能实现,这难道就是程序员的职业素养?哈哈哈哈 从网上找了很多方法,最后自己找到一个十分简单的打开 mpp 文件的方法: p ...
- MySQL 8.0.13安装修改密码的一个问题,记录一下。
https://blog.csdn.net/qq_37350706/article/details/81707862 关于安装MySQL 8.0.13,本人就不多说了,上面这个链接讲的非常详细 请参考 ...
- C# DataTable 转实体对象
DataTable 转实体对象 /// <summary> /// DataTable通过反射获取单个对象 /// </summary> public static T ToS ...
- vue父组件引用多个相同的子组件传值
没有什么问题是for 解决不了的,我一直深信这句话,当然这句话也是我说的 父组件引用多个相同的子组件传值问题 (这种情况很少遇到) 1 <template> 2 <div> 3 ...
- linux echo命令颜色显示
echo命令颜色显示: echo: -n: 不换行. -e:让转移符生效. \t(tab) \n (换行) 实例: $ echo -e "\033[34mabcd\03 ...
- 一、Hadoop入门概述
一.Hadoop是什么 Hadoop是一个由Apche基金会所开发的分布式系统基础架构. 主要解决海量数据的存储和海量数据的分析计算问题. 广义上来说,Hadoop通常是指一个更广泛的概念—Hadoo ...