标签:专题 return 数论 LL Kuangbin mod include 欧几里得 extgcd
青蛙的约会 扩展欧几里得法求解同余方程
题意:两只青蛙,沿着一条首位相连的数轴在跳,数轴长度为L,A在x处,一次可以跳m米,B在y处,一次可以跳n米,问跳了几次后碰面。
移项得 即(m-n)*t+k*L=y-x
注意y-x必须大于0
我代码中
运用extgcd(m-n,L,a,k) 得到的a是 的解,要得到原方程的解,还需要
才是的解
以及(y-x)无法被gcd(m-n,L)整除的话,无解
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL x,y,m,n,L;
LL extgcd(LL a,LL b,LL &x,LL &y) //返回gcd(a,b) ax+by=1
{
if(a==0&&b==0) return -1;
if(b==0) {x=1;y=0;return a;}
LL d=extgcd(b,a%b,y,x);
y=y-a/b*x;
return d;
}
LL mod_inverse(LL a,LL n)
{
LL x,y;
LL d=extgcd(a,n,x,y); //由扩展欧几里得得到一个特解x
if(d==1) return (x%n+n)%n; //+n 防负数。。 x变为最小非负整数解
else return -1;
}
int main()
{
// if(x<0) x=L+x;
// if(y<0) y=L+y; 原先我这么写可真是傻逼啊,我应该让y-x>0,同步改
//设时间为t,则两个青蛙的位置分别为(x+mt)mod L、(y+nt) mod L,相遇即是(x+mt)%L=(y+nt)%L,即(m-n)*t+k*L=y-x
LL x,y,m,n,L;
while(cin>>x>>y>>m>>n>>L)
{
if(m<n) swap(m,n),swap(x,y); //这行代码是必要的 extgcd函数是必须的
LL a,k;
LL c=y-x;
LL d=extgcd(m-n,L,a,k);
LL r=mod_inverse((m-n)/d,L/d);
if(c%d) cout<<"Impossible"<<endl; //c不是d的倍数,则无解
else cout<<((r*c/d)%(L/d)+L/d)%(L/d)<<endl; // (a*c/d)%(L/d)+(L/d)也对 这个是最小正答案
}
return 0;
}
标签:专题,return,数论,LL,Kuangbin,mod,include,欧几里得,extgcd 来源: https://blog.csdn.net/iroy33/article/details/88638591
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。