题解 P1516 【青蛙的约会】

题目链接

Solution 青蛙的约会

题目大意:求解不定方程\(ax+by=c\)

分析:我们可以把原来的同余式子写成一个不定方程,这部分基本操作不讲,主要讲方程求解。看到不定方程我们就想到\(exgcd\)对吧?

但是\(exgcd\)只能适用于求解\(ax+by=g\),其中\(g=gcd(a,b)\)的情况

我们设\(exgcd\)求出的一组特解是\((x_0,y_0)\),显然对于方程\(ax+by=c\)的一组解就是\((x_oc/g,y_0c/g)\)对吧?如果\(g \nmid c\)无解。

这里补充一个知识点(来自紫书)

设\(a,b,c \in Z\)。若方程\(ax+by=c\)的一组整数解为\((x_0,y_0)\),那么它的任意整数解都可以写成\(x_0+kb',y_0+ka'\),其中\(a'=a/gcd(a,b),b'=b/gcd(a,b)\)

但是题目中求的是最小的\(x\),我们设其为\(x_{min}\),设我们找到的\(ax+by=c\)的一组特解为\(x\)

那么\(x_{min}=x+k*b/gcd(a,b)\),即\(x_{min} \equiv x(mod\;b/gcd(a,b))\)

\[\therefore x_{min}=x\;mod\;b/gcd(a,b)\]

代码:

#include <cstdio>
using namespace std;
typedef long long ll;
inline ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x = 1,y = 0;
        return a;
    }
    ll res = exgcd(b,a % b,y,x);
    y -= (a / b) * x;
    return res;
}
ll a,b,m,n,l,x,k;
int main(){
    scanf("%lld %lld %lld %lld %lld",&a,&b,&m,&n,&l);
    ll res = exgcd(m - n,-l,x,k);
    if((b - a) % res)return printf("Impossible\n"),0;//判断无解
    ll ans = (x * (b - a) / res) % (l / res);//先求出ax+by=c特解x,再求xmin
    while(ans < 0)ans += l / res;//处理负数
    return printf("%lld\n",ans),0;
}

原文地址:https://www.cnblogs.com/colazcy/p/11515127.html

时间: 2024-10-20 13:37:58

题解 P1516 【青蛙的约会】的相关文章

P1516 青蛙的约会

题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这两只青蛙分别叫

【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. --信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳到一格才行,所以说 \(x+mt=y+nt(mod l) \) \((x-y)+(m-n)t=0(mod l)\) \((m-n)t+ls=(y-x)  s属于整数集\) 令a=n-m,b=l,c=gcd(a,b),d=x-y 则有\( at+bs=d\) 扩展欧几里得求解. 设c=gcd(a,b)

P1516 青蛙的约会 洛谷

https://www.luogu.org/problem/show?pid=1516 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

题目描述 两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0 令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c 方程有解,当且仅当c%Gcd(a,b)=0 令r=Gcd(a,b) 为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解? 目标解aX+bY==c 有解的条件是c%r=0,也就是c=K*r 那么就办成了aX+bY=K*r 那么也就是解a*(X/K)+b(Y/K)=r 然后扩展欧几里得定理就是解a*X+b*Y=r 那么解出来X之后X就要乘

luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)

题意 题解 做了这道题,发现扩欧快忘了. 根据题意可以很快地列出线性同余方程. 设跳了k次 x+mkΞy+nk(mod l) (m-n)kΞ-(x-y)(mod l) 然后化一下 (m-n)k+(x-y)Ξ0(mod l) 也就是前面一坨是l的倍数 不妨设 (m-n)k+(x-y)=-tl (m-n)k+tl=-(x-y) 我们要求的就是保证t<=0(因为我们设的-t倍的l,所以t<=0),k>=0时k的最小值 发现这是一个不定方程 根据裴蜀定理(这个定理搜狗输入法上没有) 当-(x-y

【题解】青蛙的约会

算是笔者的数学第一题吧…… 题目链接 解: 显然我们已知的条件有:青蛙A和青蛙B的初始坐标,跳动速度以及纬线长度.想要相遇,显然要使得跳动长度是L的整数倍. 那么,我们设它们跳了T步,则有: X+mT-(Y+nT)=LP,P为正整数. 移项整理,得: X+mT-Y-nT=LP X-Y+(m-n)T=LP X-Y+(m-n)T-LP=0 提出负号得: (n-m)T+LP=X-Y 显然套用不定方程基本形式: Ax+By=C,有解当且仅当GCD(A,B)|C. 我们可以套用Exgcd求解,求出一组解,

Luogu_P1516【题解】青蛙的约会 exgcd

题目链接:https://www.luogu.org/problem/P1516 由题目可以得出: x+k*m=y+k*n(mod l) 将mod l放入公式: (x-y)=(n-m)*k+l*t 设n-m为w 设x-y为c 则 k*w + l*t = c 那么就可以用exgcd来求解了. 先解出 k*w + l*t = d = gcd(w,l)  然后把答案乘 c/d 就可以求出了. 但是还不是最优解,有一个神仙公式,也就是代码统计答案的最后一行. 取个模. 代码如下: #include<bi

[Luogu P1516]青蛙的约会

按照题意,显然可以列出同余方程,k即为所求天数,再将其化为不定方程 ,那么对这个方程用扩展欧几里德算法即可得出k,q的一组解,但是方程有解的充要条件是(m – n) 和L不同时为零并且x – y是m – n和L的因子,扩展欧几里德算出的解才是方程的解 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<string> #include<

1477: 青蛙的约会

1477: 青蛙的约会 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 261  Solved: 164[Submit][Status][Discuss] Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某