首页 > 代码库 > 青蛙的约会
青蛙的约会
传送门
题目描述
求 x+m*t≡y+n*t (mod l)
题解
将上式
转换一下...
x-y≡(n-m)*t(mod l)
(n-m)*t+l*k=x-y...
然后用扩展欧几里得求...
因为我们用扩展欧几里得求出的是(n-m)*t+l*k=gcd(n-m,l)=(x-y)/k;(当 x-y % gcd(n-m,l) !=0时无解.
所以答案的 t=扩展欧几里得求出的t*(x-y)/gcd(n-m,l)
又因为要求是最小正整数解..
x=(x0%(b/gcd(a,b))+b/gcd(a,b))%(b/gcd(a,b))即为x的最小整数解。
至于为什么..戳这里
代码
#include<iostream> #include<cstdio> #define LL long long using namespace std; LL a,t,k,x,y,z,m,n,l,ans; LL gcd(LL x,LL y){ return y==0?x: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); z=x;x=y;y=z-a/b*y; } int main(){ scanf("%d%d%d%d%d",&x,&y,&m,&n,&l); a=m-n;k=y-x; t=gcd(a,l); if(k%t!=0){ printf("Impossible\n"); return 0; } exgcd(a,l,x,y); l=l/t;if(l<0)l=-l; x=x*k/t; printf("%d\n",(x%l+l)%l); return 0; }
青蛙的约会
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。