首页 > 其他分享 >AtCoder-abc340_f题解

AtCoder-abc340_f题解

时间:2024-02-10 23:33:04浏览次数:30  
标签:lfloor AtCoder frac gcd 题解 ll exgcd abc340 ax

题意简述

给定整数 \(x,y\),询问是否存在整数 \(a,b\),满足:

  • \(-10^{18} \le a,b \le 10^{18}\)。

  • 由 \((0,0),(x,y),(a,b)\) 三点构成的三角形面积为 \(1\)。

如果存在,输出任意一组;否则输出 -1

思路

先假设 \(x,y,a,b\) 都是正数。那么图大概是这样:

此时红色三角形的面积就是 \(S_{\triangle ABD}-S_{\triangle OBD}-S_{\triangle ABD}=\frac{xy}{2}-\frac{xb}{2}-\frac{(x-a)y}{2}=\frac{xy-xb-xy+ay}{2}=\frac{ay-xb}{2}=1\)。

\(\therefore ay-xb=2\),即 \(ya+(-x)b=2\)。

这是一个形如 \(ax+by=c\) 的二元线性丢番图方程。设 \(g=\gcd(a,b)\)。根据裴蜀定理,当 \(2\) 是 \(g\) 的倍数时,该方程有解。因此无解的条件就是 \(g>2\)。

接下来可以用扩展欧几里得算法求解。

欧几里得算法:

\(\gcd(a,b)=\gcd(b,a \bmod b)\)。若 \(b=0\),则 \(\gcd(a,b)=a\)。

扩展欧几里得算法:

先来解 \(ax+by=g\)。

以样例 \((3,5)\) 为例。将这个迭代过程展现出来,就是这样:

a b
\(3\) \(5\)
\(5\) \(3\)
\(3\) \(2\)
\(2\) \(1\)
\(1\) \(0\)

最后 \(a=1,b=0\),此时 \(x=1,y=0\) 就是一组合法的解。

能否根据最后一层的解不断往上求呢?

设倒数第二层的数为 \(a,b\),解为 \(x^{\prime},y^{\prime}\);最后一层的数为 \(b,a \bmod b\),解为 \(x,y\)。则有:

\(ax^{\prime}+by^{\prime}=1,bx+(a \bmod b)y=1\)。

\(\because a \bmod b=a-\lfloor \frac{a}{b} \rfloor \times b\)

\(\therefore bx+(a-\lfloor \frac{a}{b} \rfloor b)y=1\)

乘法分配:

\(\therefore bx+ay-\lfloor \frac{a}{b} \rfloor by=1\)

变形一下:

\(\therefore ay+bx-\lfloor \frac{a}{b} \rfloor by=1\)

合并同类项:

\(\therefore ay+b(x-\lfloor \frac{a}{b} \rfloor y)=1\)

到这个时候就已经做出来了,因为 \(x^{\prime}\) 变成了 \(y\),\(y^{\prime}\) 变成了 \(x-\lfloor \frac{a}{b} \rfloor y\)。

我们可以写一个 exgcd 函数,在求解 \(\gcd(a,b)\) 的同时返回一组 \(ax+by=1\) 的解。但是此时有三个返回值,这个时候我们可以传址调用。

函数如下。

ll exgcd(ll a,ll b,ll &x,ll &y){
	/*返回gcd(a,b),以及ax+by=gcd(a,b)的解x,y*/
	if(!b){
		/*b=0,则gcd(a,b)=1,同时x=1,y=0是一组解*/
		x=1;y=0;return a;
	}
	ll g=exgcd(b,a%b,x,y),t;
	t=x;
	x=y;
	y=t-a/b*y;
	return g;
}

我们还可以在迭代的时候就交换 \(x,y\),这样就不用再声明 \(t\) 了。函数如下。

ll exgcd(ll a,ll b,ll &x,ll &y){
	/*返回gcd(a,b),以及ax+by=gcd(a,b)的解x,y*/
	if(!b){
		/*b=0,则gcd(a,b)=1,同时x=1,y=0是一组解*/
		x=1;y=0;return a;
	}
	ll g=exgcd(b,a%b,y,x);
	/*在这里直接交换x,y*/
	y-=a/b*x;
	return g;
}

这样求解出来后,只是 \(ax+by=g\) 的解。要想求出 \(ax+by=2\) 的解,只需将两边同乘 \(\frac{2}{g}\) 即可。

那么正负号的问题呢:

exgcd 函数是不能接受负数的,因此应该把绝对值传进去。

原来是 \(ya+(-x)b=2\),现在是 \(\lvert y \rvert a+\lvert -x \rvert b=2\)。如果 \(y<0\),那么 \(\lvert y \rvert=-y\),此时 \(a\) 应该变为 \(-a\)。如果 \(x>0\),那么 \(\lvert -x \rvert=x\),此时 \(b\) 应该变为 \(-b\)。那么这道题就做出来了。

代码

标签:lfloor,AtCoder,frac,gcd,题解,ll,exgcd,abc340,ax
From: https://www.cnblogs.com/lrxmg139/p/18013107

相关文章

  • P4183 [USACO18JAN] Cow at Large P 题解
    Description贝茜被农民们逼进了一个偏僻的农场。农场可视为一棵有\(N\)个结点的树,结点分别编号为\(1,2,\ldots,N\)。每个叶子结点都是出入口。开始时,每个出入口都可以放一个农民(也可以不放)。每个时刻,贝茜和农民都可以移动到相邻的一个结点。如果某一时刻农民与贝茜相遇了......
  • AtCoder Beginner Contest 340
    A-ArithmeticProgression(abc340A)题目大意给定等差数列的首项、末项、公差。输出这个等差数列。解题思路从首相依次累加公差到末项即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_std......
  • ABC340
    E我们可以知道每一个点在每一轮加多少,具体如下:假如现在操作的点的为\(k\)。那么所有的数都至少会加\(\dfrac{A_k}{n}\)。但是肯定有剩的,剩了\(A_k\modn\)。很明显,\(A_k\modn\)会分给接下来的\(A_k\modn\)个数。这样我们就可以知道每个点每轮加多少了。然后用线段......
  • [AGC062B] Split and Insert 题解
    题目链接点击打开链接题目解法咋神仙区间\(dp\)题永远想不到区间\(dp\)???首先把操作顺序反转那么现在的问题就是:每次可以选出一个子序列放到序列末尾,使序列升序的最小代价这个问题看着也是毫无头绪我尝试去找些规律,当然也没找到考虑精细刻画操作过程:最终的序列是升序的,最......
  • P8670 [蓝桥杯 2018 国 B] 矩阵求和 题解
    题目传送门前置知识欧拉函数解法欧拉反演,简单地推下式子即可。\(\begin{aligned}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\gcd(i,j)^{2}&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{d=1}^{n}d^{2}[\gcd(i,j)=d]\\&=\sum\limits_{i=1}^{n}\sum......
  • Atcoder Grand Contest 056 B - Range Argmax
    因为一组\(x\)可能对应多组\(p\),考虑怎么让决策唯一化。我们从大到小依次钦定每个值的位置,即倒着遍历\(i=n,n-1,\cdots,1\),找到最左端的位置\(v\)满足,对于现在还活着的所有区间\(j\)满足\(l_j\lev\ler_j\),都有\(x_j=v\),令\(p_j=i\),然后删去所有包含\(i\)的区间。......
  • Atcoder Grand Contest 041 F - Histogram Rooks
    考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为\(A\)。把与\(A\)中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是\(2^{\text{剩余点的个数}}\),乘以\((-1)^{|A|}\)并求和即可。这个做法直接优化显然不行。我们考虑设\(A\)中的点所在的列组成的不可重集......
  • Ucup2 -19题解
    Ucup2-19题解:​ 这场的题还是挺有意思的,之前回家后因为过年的准备+美赛摆了挺久没训练,现在开始复健,顺便复活一下死去已久的博客。​ 水题就不赘述了,这次主要说说几道比较难的但思路很有趣的题目,顺序就按难度排吧。G.LCACountingProblem-G-Codeforces题意:给定一颗无向......
  • AtCoder ABC 263 D 题解
    AtCoderABC263D题解前言本蒟蒻的第一篇题解,大佬勿喷QwQ传送门们洛谷传送门AtCoder传送门正文设有\(x\)使得\(x\leqk\)时,令\(f(k)\)为对\(A'\)进行运算后\(A'=(A_1,A_2,\ldots,A_k)\)的最小和。同理,对于\(y\)使得\(y\leqk\)时,令\(g(k)\)为对\(A......
  • 新年欢乐赛题解
    cyh巨佬举办的比赛。比赛页面赛后补题官方题解赛时没时间写题,赛后补一下。T1:默认排名第一,对于每次输入,若输入的成绩更优,则将排名降低。这里更劣的成绩没用,因为默认初始排名第一。T2:At上的一道原题。考虑DP求解。\(dp_{i,0/1}\)分别表示到第\(i\)张翻和不翻的总......