POJ 1061 青蛙的约会(exgcd)

嗯...

 

题目链接:http://poj.org/problem?id=1061

 

两只青蛙相遇时肯定满足:x+k*m≡y+k*n(mod L)

            x+k*m-(y+k*n)=L*s

            k*(n-m)-s*L=x-y
 
即把模线性方程变形后a*x+b*y=c,用exgcd求解,
先ax+by=gcd(a,b)
判断c整除g
然后解就是(x+k*b/g) ,(y-k*a/g)
注意答案要求非负,所以要进行处理...
 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 
 4 using namespace std;
 5 
 6 inline void exgcd(long long a, long long b, long long &g, long long &x, long long &y){
 7     if(!b) { g = a; x = 1; y = 0;}
 8     else { exgcd(b, a % b, g, y, x); y -= x * (a / b);} 
 9 }
10 
11 int main(){
12     long long xx, yy, l, m, n, a, b, c, g, x, y;
13     scanf("%lld%lld%lld%lld%lld", &xx, &yy, &m, &n, &l);
14     a = n - m; b = l; c = xx - yy;
15     exgcd(a, b, g, x, y);//(n-m) * x + l * y = xx - yy 
16     if(c % g) printf("Impossible\n");
17     else{
18         c /= g; b /= g;
19         printf("%lld\n", (x % b * c % b + b) % b);//处理非负 
20     }
21     return 0;
22 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11482405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值