洛谷题号:P1516

出处:?

主要算法:数论

难度:4.4

思路分析:

典型的同余方程。由于是纬线,绕一圈是可以绕回来的,所以是可以取模的。

  阅读题目,很容易得到同余方程$ x + tm ≡ y + tn (mod\ L)$

  于是我们可以通过Exgcd来求解。先转化为不定方程 $ x + tm - y - tn = sL $

  整理得 $ (m - n)t - Ls = y - x $

  设 $a = n - m, b = L, c = x - y$,代入可得 $ -at - bs = -c $,即 $ at + bs = c $

  因此通过先求解 $ at + bs = gcd(a, b) $,最后就能够解得一组特解了。转化成最小正整数解即可。

  然而要处理的事情还有很多。首先我们来想如何得到最小正整数解。

  设答案为$x$,我们得到的特解为$x_0$,则根据我们的公式一定有 $ x_0 = x + k * b / gcd(a, b) $。我们可以把它看做出发的形式,即$ x = x_0 \% (b / gcd(a, b)) $。

  因此我们的答案就是$ x \% (b / gcd(a, b)) $ …… ? 万一$x \leq 0$?我们的答案应该是 $ (x + (b / gcd(a, b)) \% (b / gcd(a, b) $,防止爆负数。

  但是考虑一下$ b/gcd(a,b) 与 a, b$的符号,若$a, b$同号那没事,如果$a, b$异号且$ a < 0, b > 0$,那么情况就有点麻烦了……… $ gcd(a, b) $肯定小于0,而$b > 0$,所以 $ b / gcd(a, b) $ 一定小于0,因此按照这样的做法,答案不仅无法变成最小正整数解,反而更小了……

  有没有一种方法来避免$ a < 0, b > 0$这种情况呢?

  考虑可不可以永远保持$a$为正数。

  $ax + by = c$ 与 $-ax + by = -c$的解是否完全一样?

  乍一眼看不出来,可以转化为同余方程的形式,那么前者就能够变成$ c ≡ ax (mod\ b) $,后者就能够变成$ ax ≡ c (mod\ b) $。看来是完全一样的。

  因此当$a < 0$时,$a$和$c$转换成相反数就可以了。

代码注意点:

  long long

Code

/*By QiXingzhi*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
#define int ll
const int N = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
int x,y,m,n,L,s,t,a,b,c,g;
int gcd(int a, int b){
return b==?a:gcd(b,a%b);
}
void exgcd(int a, int b){
if(b == ){
t = ;
s = ;
return;
}
exgcd(b,a%b);
int tmp = t;
t = s;
s = tmp - a/b * s;
}
#undef int
int main(){
#define int ll
//freopen(".in","r",stdin);
x = r, y = r, m = r, n = r, L = r;
a = n - m;
b = L;
c = x - y;
if(a < ){
a = -a;
c = -c;
}
g = gcd(a,b);
exgcd(a,b);
t *= c / g;
s *= c / g;
if(c % g != ){
printf("Impossible");
return ;
}
printf("%lld",(t + (b/g)) % (b/g));
return ;
}

「洛谷P1516」 青蛙的约会的更多相关文章

  1. 【洛谷P1516】青蛙的约会

    题目大意:给定 \(a,b,c\),求线性同余方程 \(ax+by=c\) 的最小正整数解. 题解:首先判断方程是否有解,若 c 不能整出 a 与 b 的最大公约数,则无解.若有解,则利用扩展欧几里得 ...

  2. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  3. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  4. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  5. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

  6. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

  7. 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】

    题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...

  8. 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】

    题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits ...

  9. 「洛谷1884」「USACO12FEB」过度种植【离散化扫描线】

    题目链接 [洛谷传送门] 题解 矩阵面积的并模板.(请求洛谷加为模板题) 很明显是要离散化的. 我们将矩阵与\(x\)轴平行的两个线段取出来.并且将这两个端点的\(x1\)和\(x2\)进行离散化. ...

随机推荐

  1. vscode 缩进改为2空格

    因为vscode默认启用了"editor.detectIndentation": true”根据文件类型自动设置tabsize的选项. 在配置中加上 "editor.de ...

  2. struts2之配置文件struts.xml详解

    struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解  以便于理解 和修改 <?xml version=" ...

  3. 一种简单有效的VBA源代码加密办法,支持64位宿主,适用于大部分VBA代码加密

    原始出处:http://www.cnblogs.com/Charltsing/p/EncryptVBACode.html VBA代码加密是个老生常谈的问题,自从本人的VBA Dumper发布之后,在O ...

  4. Mysql的使用,常用的SQL语句

    一.启动mysql服务 启动mysql服务: systemctl start mysqld.service root用户登录mysql: 修改root 密码: alter user 'root'@'l ...

  5. 《梦断代码》Scott Rosenberg著(三)

    开放与封闭之论: 程序源代码是商业软件公司最重要的资产,所以软件公司售卖二进制文件.这样也就意味着如果微软的软件产品出了问题,即便你是一个程序大牛也无法修复它.你只能等着微软来修正问题,因为只有微软程 ...

  6. python_超级基础

    初识计算机 CPU 计算机的大脑.中央处理单元,主要负责数据运算及计算,是运算计算中心. 存储器 内存 临时存储数据,供CPU运算使用. 优点: 读取速度快. 缺点: 容量小,成本高,断电即消失. 硬 ...

  7. 持续集成之Jenkins自动部署war包到远程服务器

    一.无war包链接的情况 无war包链接时,需先下载war包到本地,然后执行: ---------------------------------------------以下部分为转载-------- ...

  8. vim 永久添加行号

    sudo vi /etc/vim/vimrc 打开vimrc文件,最下面添加set nu,保存就可以添加行号了,set autoindent是自动换行

  9. css 图片文字垂直居中

    先来看张图片 相信很多css新手遇到过这种问题,就是当图片和文本显示在一行的时候,效果很奇葩,文字和图片没法对齐, 这时我们需要做的是: 1,先给块级元素设置 display: inline-bloc ...

  10. Oracle NVL空值处理函数

    --NVL空值处理函数 --需求:显示价格表中业主类型ID为1的价格记录 如果上限值为null,则显示9999999 ) from dual; select * from t_pricetable ) ...