首页 > 其他分享 >[题解]P5656 【模板】二元一次不定方程 (exgcd)

[题解]P5656 【模板】二元一次不定方程 (exgcd)

时间:2024-04-25 22:11:06浏览次数:12  
标签:mink frac gcd int 题解 exgcd maxk P5656

P5656 【模板】二元一次不定方程 (exgcd)

若存在\(ax+by=c\),则可以根据特解\(x,y\)求出任意通解\(x',y'\):
\(\begin{cases} x'=x+k*\frac{b}{\gcd(a,b)}\\ y'=y-k*\frac{a}{\gcd(a,b)} \end{cases}(k\in \mathbb{Z})\)

求特解的方法是「扩展欧几里得(exgcd)」,如果没接触过可以先阅读此文或搜索更多信息。

该方程有整数解当且仅当\(\gcd(a,b)|c\)。所以不满足直接输出-1

接下来考虑怎么求通解。显然\(k\)有一个取值范围,这个范围内每个\(k\)都对应一组解。我们只需要算出\(x',y'>0\)时\(k\)的取值范围,一切就好弄了。

记\(\frac{b}{\gcd(a,b)}=r,\frac{a}{\gcd(a,b)}=s\)。则:

  • \(x'>0\iff x+kr>0\iff k>-\frac{x}{r}\),故\(k\)的最小值\(mink=\lfloor -\frac{x}{r}\rfloor+1\)。
  • \(y'>0\iff y-ks>0\iff k<\frac{y}{s}\),故\(k\)的最大值\(maxk=\lceil \frac{y}{s}\rceil-1\)。

如果\(mink>maxk\),说明有整数解但没有正整数解,输出\(2\)个值:

  • \(x\)最小值:\(x+mink*r\)。
  • \(y\)最小值:\(y-maxk*s\)。
    否则说明有整数解,需要输出\(5\)个值:
  • 个数:\(maxk-mink+1\)。
  • \(x\)最小值:\(x+mink*r\)。
  • \(y\)最小值:\(y-maxk*s\)。
  • \(x\)最大值:\(x+maxk*r\)。
  • \(y\)最大值:\(y-mink*s\)。

注意:开long long

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,a,b,c;
int exgcd(int a,int b,int& x,int& y){
	int d;
	if(b==0) x=1,y=0,d=a;
	else d=exgcd(b,a%b,y,x),y-=a/b*x;
	return d;
}
signed main(){
	cin>>t;
	int x,y;
	while(t--){
		cin>>a>>b>>c;
		int gcd=exgcd(a,b,x,y);
		if(c%gcd!=0){
			cout<<"-1\n";
			continue;
		}
		int stepx=b/gcd,stepy=a/gcd;
		x*=c/gcd,y*=c/gcd;
		int mink=floor(-1.0*x/stepx)+1,maxk=ceil(1.0*y/stepy)-1;
		if(mink>maxk){
			cout<<x+mink*stepx<<" "<<y-maxk*stepy<<"\n";
		}else{
			cout<<maxk-mink+1<<" ";
			cout<<x+mink*stepx<<" "<<y-maxk*stepy<<" ";
			cout<<x+maxk*stepx<<" "<<y-mink*stepy<<"\n";
		}
	}
	return 0;
}

标签:mink,frac,gcd,int,题解,exgcd,maxk,P5656
From: https://www.cnblogs.com/Sinktank/p/18158708

相关文章

  • [题解][2021浙江CCPC] String Freshman
    题目描述有一份错误的字符串匹配算法,计算S串里有几个T串(只要有一个元素不同,则视为不同的串)。现在输入T串,判断能否构造S串让该算法不通过。intFind_Answer(){intj=1,ans=0;for(inti=1;i<=n;i++){if(S[i]!=T[j])j=1;if(S[......
  • 「实用」如何在洛谷上正确的抄题解
    前言看到这个标题,估计一群人又要开始躁动不安了……等一下,如果是洛谷的管理员看到了这篇文章,不要把我给封了,我是在教各位刚入门的小萌新,也就是以后的神犇们如何切水题呢!本文没有任何反对洛谷的意思,坚决支持kkk!好了,进入今天的正题,“如何在洛谷上正确的抄题解”这个标题直接概括......
  • [题解]CF61E Enemy is weak
    CF61EEnemyisweak如下图,第\(i\)行\(j\)列表示第\(j\)个数结尾,向前长度为\(i\)的逆序子序列个数。递推方式见下图。第一行全为\(1\)。要填第\(2\)行的值,就往前找所有\(>\)当前元素的位置,把它们第\(1\)行的值加起来。要填第\(3\)行的值,就往前找所有\(>\)当前元素的位置,把......
  • 「洛谷」题解:P1996 约瑟夫问题
    题目传送门先看题目:题目描述\(n\)个人围成一圈,从第一个人开始报数,数到\(m\)的人出列,再由下一个人重新从\(1\)开始报数,数到\(m\)的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰......
  • [题解] [NOIP2011 提高组] Mayan 游戏
    [题解][NOIP2011提高组]Mayan游戏题目描述有一个\(7\)行\(5\)列的格子棋盘,有的格子上有方块。方块有重力,即如果一个方块下面没有其他方块,他就会往下掉,直到触底或者下面有方块为止。每个方块都有自己的颜色,如果连着三个竖着或者横着的方块颜色相同,它们就会消除。如果出......
  • CF1774G Segment Covering 题解
    题目链接点击打开链接题目解法这么牛的题!!!我第一眼看到偶\(-\)奇想到的是LGV/xk有一堆线段的题先考虑有没有线段之间的特殊关系这道题中,如果有线段\(x\)包含线段\(y\),则线段\(x\)是无用的,因为如果选了\(x\),那么选不选\(y\)无所谓,因为是偶\(-\)奇,所以贡献抵消了......
  • 重庆软航H5 PDF签章产品经nginx代理之后在浏览器中在线打开PDF盖章时提示:签章失败:网络
    问题现象:问题描述:在系统中集成了软航H5PDF签章产品,软航H5PDF签章产品的对应服务是通过nginx代理的,在奇安信浏览器中在线打开PDF点击产品的工具栏上的盖章按钮:选定印章之后,在PDF文档上选定盖章位置之后,提示:签章失败:网络错误。最近在做这个软航H5PDF电子签章产品的测试,就简......
  • CF518F 题解
    观察到一条管道的拐点数量只有\(3\)种可能的取值:没有拐点,即管道呈现一条直线。有\(1\)个拐点。有\(2\)个拐点。分别对应了下面三种情况:....#....#.*..#*********..***...#....#*...#*.#.........
  • 2023CPCC河南省赛题解+总结
    2023CPCC河南省赛题解+总结比赛链接:https://codeforces.com/gym/104354答题情况:答题情况开题顺序是:A-F-H-K-E-B-G题面链接:https://codeforces.com/gym/104354/attachments/download/20061/statements_2.pdfProblemA.小水獭游河南签到题,队友写的题意:  给你一个字符......
  • git命令下,mac环境下载依赖相关报错问题解决方案
    1.安装fundry框架curl-Lhttps://foundry.paradigm.xyz|bash2.写入环境变量source/Users/xx/.bashrc3.foundryup问题1报错:致命错误:无法访问'https://github.com/foundry-rs/forge-std解决方案:设置hosts文件:添加指定url的ip地址:140.82.112.4github.com185.1......