洛谷 P1516 青蛙的约会 题解
根据题目大意,设答案为 ,不难列出式子:
移项,得
合并同类项
显然这就是一个线性同余方程,先把它变成一个不定方程
exgcd 得出 即可
代码:
#include<cstdio> using namespace std; //#define debug typedef long long ll; typedef long long Type; inline ll abs(int x){ return x>0?x:-x; } inline Type read(){ Type sum=0; int flag=0; char c=getchar(); while((c<'0'||c>'9')&&c!='-') c=getchar(); if(c=='-') c=getchar(),flag=1; while('0'<=c&&c<='9'){ sum=(sum<<1)+(sum<<3)+(c^48); c=getchar(); } if(flag) return -sum; return sum; } ll gcd(ll x,ll y){ if(x%y==0) return y; return gcd(y,x%y); } void exgcd(ll a,ll b,ll &x,ll &y){ if(!b){ x=1,y=0; return; } exgcd(b,a%b,x,y); ll t=x; x=y; y=t-(a/b)*y; return; } inline ll LiEu(ll a,ll b,ll p){ if(a<0) a=-a,b=-b; b=(b%p+p)%p; if(b%gcd(a,p)) return -1; ll x,y,r; exgcd(a,p,x,y); x=x*(b/gcd(a,p)); r=p/gcd(a,p); return (x%r+r)%r; } ll x,y,m,n,l,ans; int main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); x=read(); y=read(); m=read(); n=read(); l=read(); if(x==y) return printf("Impossible"),0; ans=LiEu(n-m,x-y,l); if(ans==-1) return printf("Impossible"),0; printf("%lld",ans); return 0; }
【推荐】国内首个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满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具