ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷 P1516 青蛙的约会 题解

2021-05-03 22:01:49  阅读:228  来源: 互联网

标签:洛谷 pmod 题解 P1516 kn long getchar Type equiv


题目传送门

根据题目大意,设答案为 \(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有