洛谷 P1516 青蛙的约会 题解

题目传送门

根据题目大意,设答案为 k ,不难列出式子:

x+kmy+kn(modL)

移项,得

xyknkm(modL)

knkmxy(modL)

合并同类项

(nm)kxy(modL)

显然这就是一个线性同余方程,先把它变成一个不定方程

(nm)k+Lr=(xy)

exgcd 得出 k 即可

代码:

#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;
}
posted @   jiangtaizhe001  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示