「洛谷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」 青蛙的约会的更多相关文章
- 【洛谷P1516】青蛙的约会
题目大意:给定 \(a,b,c\),求线性同余方程 \(ax+by=c\) 的最小正整数解. 题解:首先判断方程是否有解,若 c 不能整出 a 与 b 的最大公约数,则无解.若有解,则利用扩展欧几里得 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
- 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...
- 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】
题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits ...
- 「洛谷1884」「USACO12FEB」过度种植【离散化扫描线】
题目链接 [洛谷传送门] 题解 矩阵面积的并模板.(请求洛谷加为模板题) 很明显是要离散化的. 我们将矩阵与\(x\)轴平行的两个线段取出来.并且将这两个端点的\(x1\)和\(x2\)进行离散化. ...
随机推荐
- LeetCode 832. Flipping an Image
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...
- filebeat 源码编译安装
下载filebeat源码(6.2.3)下载地址:链接: https://pan.baidu.com/s/1cPR7-xlQJuYZ77uaUpfSpQ 提取码: k77u github下载地址:htt ...
- RabbitMQ总结
消息队列 三个业务场景:解耦.异步.削峰 带来问题 系统可用性降低:外部依赖越多,越容易挂掉. 系统复杂性提高:重复消费,消息丢失,消息传递的顺序性 一致性问题: 一.如何保证消息的可靠性传输(如何处 ...
- IP判断
题目描述 在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性. 合法的IP是这样的形式: A.B.C.D 其中A.B.C.D均为位于[0, 255]中的整数.为了简单起见,我们规定 ...
- vue echarts 动态数据
安装echarts依赖 npm install echarts -S 或者使用国内的淘宝镜像: 安装 npm install -g cnpm --registry=https://registry.n ...
- JSLinux
JSLinuxhttps://bellard.org/jslinux/vm.html?url=https://bellard.org/jslinux/win2k.cfg&mem=192& ...
- 下拉框插件select2的使用
它的优点有: 样式还算好看,支持多选,支持索搜 下面来介绍下select2的用法 1.最简单的用法 只需要加载css和js即可使用 <select name="" id=&q ...
- Day1 基础知识
数据类型,字符编码 二进制: 定义:二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是 ...
- CSS3 background-size属性兼容
background-size是CSS3新增的属性,但是IE8以下还是不支持 background-size:contain; // 缩小图片来适应元素的尺寸(保持像素的长宽比):background ...
- Python __slots__ 作用
参考:https://blog.csdn.net/u010733398/article/details/52803643 https://blog.csdn.net/sxingming/artic ...