洛谷P1516 青蛙的约会(扩展欧几里德)
很容易想到,如果他们相遇,他们初始的位置坐标之差和跳的距离(设为跳的次数)之差应该是模纬线长同余的,即
转化一下,不就变成了让我们求一个不定方程中的最小非负整数解么?
设,把它转化成我们比较熟悉的一般不定方程的形式(此式的与题目给的坐标意义不同)
首先,设我们可以通过扩欧求出中的一个解
这时,因为为整数,所以也必须是整数,否则无解
否则,等式两边同乘,得
那么,就是中的一个解
如何由一个解得到其它解呢?有一个恒等式
在保证都是整数的情况下,我们让最小,就可以得到所有的整数解,那么
如果解出的,那么最小非负整数解等于;否则等于
代码就可以直接写(x%(b/g)+b/g)%(b/g)
然后就可以交上去了,发现获得了70分
怎么回事?因为只对非负整数有意义,所以如果等式两边要同时取负,都要变成相反数;本来就是正数,不用变也不能变。
总之,虽然是裸的exgcd题,但是很容易被细节实现坑到,尤其是求最小非负整数解和处理为负数的地方。
#include<cstdio>
#define LL long long
LL x,y,m,n,l,a,b,c,x0,y0,g,tmp;
void exgcd(LL a,LL b){
if(!b){x0=1;g=a;return;}//顺便求gcd
exgcd(b,a%b);
tmp=x0;x0=y0;y0=tmp-a/b*y0;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
a=n-m;b=l;c=x-y;
if(a<0)a=-a,c=-c;//处理a为负数情况
exgcd(a,b);
if(c%g)puts("Impossible");
else printf("%lld\n",(c/g*x0%(b/g)+b/g)%(b/g));//求最小非负整数解
return 0;
}
分类:
OI——题解
, 数学——数论——同余——扩展欧几里德
标签:
扩展欧几里德
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具