其他分享
首页 > 其他分享> > 洛谷 P1516 青蛙的约会 题解

洛谷 P1516 青蛙的约会 题解

作者:互联网

题目传送门

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

\[x+km \equiv y+kn \pmod L \]

移项,得

\[x-y \equiv kn-km \pmod L \]

\[kn-km \equiv x-y \pmod L \]

合并同类项

\[(n-m)k \equiv x-y \pmod L \]

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

\[(n-m)k+Lr=(x-y) \]

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;
}

标签:洛谷,pmod,题解,P1516,kn,long,getchar,Type,equiv
来源: https://www.cnblogs.com/jiangtaizhe001/p/14728290.html