HDU 2669 Romantic (扩展欧几里得定理)

题目大意:给两个数a和b,找出一组x,y使得a*x + b*y = 1,如果找不出输出sorry

 

题解:显然是用扩展欧几里得定理求解。

又扩展欧几里得定理有,如果a*x+b*y = d   要使得方程有解必有gcd(a,b)为d的约数。

而此题的d = 1  所以若gcd(a,b)!=1,则应该输出sorry

#include <bits/stdc++.h>

using namespace std;

long long e_gcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    long long ans=e_gcd(b,a%b,x,y);
    long long temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
}

long long cal(long long a,long long b,long long c)
{
    long long x,y;
    long long gcd=e_gcd(a,b,x,y);
    if(c%gcd) return -1;
    long long k=c/gcd;
    x*=k,y*=k;//相当于x=x0+b/gcd*c
    if(b<0) b=-b;
    long long ans=x%b;//最小的x
    if(ans<=0) ans+=b;
    return ans;
}

int main()
{
    long long a,b;
    while(cin>>a>>b)
    {
        long long ans=cal(a,b,1);
        if(ans==-1) printf("sorry\n");
        else printf("%lld %lld\n",ans,(1-ans*a)/b);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Fy1999/p/8783489.html

时间: 2024-08-10 21:11:02

HDU 2669 Romantic (扩展欧几里得定理)的相关文章

HDU 2669 Romantic 扩展欧几里得

点击打开链接 Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2958    Accepted Submission(s): 1160 Problem Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. B

HDU 2669 (扩展欧几里得入门)

练习一下数学知识了.. [题目链接]click here~~ [题目大意]Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead. 求满足式子的x和y否则输出"sorry" [解题思路]扩展欧几里得的基础了, 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足 等式: ax+by = gcd

扩展欧几里得定理

扩展欧几里得定理,很早之前就接触过,没看懂,放弃了,前些天有个有一个题,用扩展欧几里得定理,我竟然都不知道.决定看一下. 看扩展欧几里得定理的最好地方是用维基百科搜索扩展欧几里得算法 就能搜到 照着上面提供第例子走一遍知道什么意思了. 反正主要就是 ax+by=1(mod n) 的x,y值: 还有就是 ax=b(mod n) 这类题的通用解法: 下面粘上一个例子,看完这个例子你就明白了. poj 1061 青蛙的约会 中文题目,我的最爱. 我们设他们跳的步数为step 那么就可以写出算式 n*s

poj1061-青蛙的约会-(贝祖定理+扩展欧几里得定理+同余定理)

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:132162   Accepted: 29199 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能

hdu 5512 Pagodas 扩展欧几里得推导+GCD

题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 20000) T组数据T <= 500; 思路:由扩展欧几里得知道对于任意正整数,一定存在整数x,y使得 x*a + y*b = gcd(a,b);并且这个gcd是a,b组成的最小正整数:同时也知道了这也是两个点之间的最小距离: 之后直接求点的个数即可: ps:这道题我竟然想到了组合游戏..明显没有说双方都要用

扩展欧几里得定理总结

拓展欧几里得定理主要用来求解同余线性方程,求逆元等,遇到题目给出形如ax+by==c,要求一组满足要求的x和y时,可以联系扩展欧几里得求解 拓展欧几里得由 gcd(a,b) = gcd(b,a%b) 推出 由于 a*x + b*y == gcd(a,b) 必定有解 所以 b*x + (a%b)*y == gcd(b,a%b) 最终得到ax+by==a*y1+b*(x1-(a/b)*y1) 当x0 y0 是方程的一组解,可以得到所有解的形式满足 x=x0+b/d*t y=y0-a/d*t 当 题目

扩展欧几里得定理——POJ 1061

对应POJ 题目:点击打开链接 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 94409   Accepted: 17470 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得

扩展欧几里得定理基础讲解 代码及证明

知识储备 1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b) 2 . 负数取模:忽略符号返回绝对值就好了 3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a - k * b, 且此时k == a / b向下取整 定理内容 对于正整数a,b,必然存在整数(不一定是正数)x,y, 使得ax+by==gcd(x,y) 证明 (来自SDFZ-SPLI的援助) 把两边同时除以gcd(x,y),由朴素欧几里得定理可以得到恒等式,说明一定存在至少一组解使得$ax+b

hdu_2669 Romantic(扩展欧几里得)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2669 Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4179    Accepted Submission(s): 1745 Problem Description The Sky is Sprite.The Birds