https://www.hackerrank.com/contests/infinitum16-firsttimer/challenges/solve-equations

给定一条方程a*x + b*y = c

保证有解的情况下,我们要求一个点,满足x > 0且 这个点到原点的欧几里德距离最短

根据扩展欧几里德算法,我们能求得一组(x1,y1)满足x1 > 0的解,第一个x>0的解。

然后通解就是x2 = x1 + b/abgcd*k  y2 = y1 - a/abgcd*k

如果(x2,y2)就是所求,那么k一定要大于0,因为小于0的话,加上x1的时候会使得x2<0,这是因为x1是所有解中最小的正整数了,在它左边的解,必定是小于0的。

那么k的范围就是 >= 0了

把式子展开  x2*x2 + y2*y2

得到一条关于t的二次方程,如果对称轴在原点左边,那么t=0就是ans

否则,取对称轴。因为可能是小数,所以取整了,判断对称轴左右两个点就好了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
LL abGCD;
LL gcd (LL a, LL b) {
if (a % b == ) return b;
else return gcd (b, a % b);
}
LL exgcd (LL a,LL mod,LL &x,LL &y) {
if (mod==) {
x=;
y=;
return a;
}
LL g=exgcd(mod,a%mod,x,y);
LL t=x;
x=y;
y=t-(a/mod)*y;
return g;
}
LL get_min_number (LL a,LL b,LL c,LL &x,LL &y) {
abGCD = gcd(a,b);
if (c%abGCD != ) return -;
a /= abGCD;
b /= abGCD;
c /= abGCD;
LL tx,ty;
exgcd(a,b,tx,ty);
x = tx*c;
y = c*ty;
LL temp_x = x;
x %= b;
if (x<=) x += b;
LL k = (temp_x-x)/b;
y += k*a;
return ;
} void work () {
LL a, b, c;
cin >> a >> b >> c;
LL x, y;
get_min_number (a, b, c, x, y);
// LL bb=abs(b/gcd(a,b));
// LL aa=abs(a/gcd(a,b));
// while(x<0) x += bb;
// while(x*a+b*y!=c) y += aa;
// cout << x << " " << y << endl;
LL c1 = b / abGCD;
LL c2 = - a / abGCD;
LL A = c1 * c1 + c2 * c2;
LL B = * y * c2 + * x * c1;
LL C = x * x + y * y;
if (B > ) {
cout << x << " " << y << endl;
} else {
LL t = B / (- * A);
LL mx = A*t*t + B*t + C;
t++;
LL tmax = A*t*t + B*t + C;
if (tmax > mx) {
t--;
}
cout << x + c1*t << " " << y + c2*t << endl;
}
} int main () {
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
cin >> t;
while (t--) work ();
return ;
}

1
4 1 82

Solve Equations HackerRank 扩展欧几里德 && 数学的更多相关文章

  1. CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元

    题意: 一个数只含有4,7就是lucky数...现在有一串长度为n的数...问这列数有多少个长度为k子串..这些子串不含两个相同的lucky数... 子串的定义..是从这列数中选出的数..只要序号不同 ...

  2. HDU 2669 Romantic 扩展欧几里德---->解不定方程

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. 扩展欧几里德 SGU 106

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106   题意:求ax + by + c = 0在[x1, x2], [y1, y2 ...

  4. HDU 2669 Romantic(扩展欧几里德)

    题目链接:pid=2669">http://acm.hdu.edu.cn/showproblem.php?pid=2669 Problem Description The Sky is ...

  5. 扩展欧几里德 poj1061 青蛙的约会

    扩展欧几里德很经典.可是也有时候挺难用的.一些东西一下子想不明确.. 于是来了一个逆天模板..仅仅要能列出Ax+By=C.就能解出x>=bound的一组解了~ LL exgcd(LL a, LL ...

  6. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  7. [BZOJ1407][NOI2002]Savage(扩展欧几里德)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...

  8. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  9. 51nod 1352 扩展欧几里德

    给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ...

随机推荐

  1. 自己写的基于java Annotation(注解)的数据校验框架

    JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...

  2. RS-485半双工延时问题

    学习485总线时,遇到延时问题,困扰很久.通过学习知道了485半双工收发时必须延时,以保证系统的稳定性.可靠性.好多资料都介绍了485 防静电.抗干扰电路.惟独没提 每一帧收发停止位(或第9位)的延时 ...

  3. Python命令模块argparse学习笔记(四)

    默认参数 ArgumentParser.set_defaults(**kwargs) set_defaults()可以设置一些参数的默认值 >>> parser = argparse ...

  4. C#读写.ini文件

    转载来源: http://blog.csdn.net/source0573/article/details/49668079 https://www.cnblogs.com/wang726zq/arc ...

  5. Levenberg-Marquardt优化算法以及基于LM的BP-ANN

    一.LM最优化算法     最优化是寻找使得目标函数有最大或最小值的的参数向量.根据求导数的方法,可分为2大类.(1)若f具有解析函数形式,知道x后求导数速度快.(2)使用数值差分来求导数.根据使用模 ...

  6. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句

    请定义一个宏,比较两个数的a.b的大小,不能使用大于.小于.if语句 方法一:    #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b): ...

  7. 16_点击事件第三种写法_activity实现接口

    第一种写法是有名内部类,第二种写法是匿名内部类,第三种写法是MainActivity实现接口OnClickListener.直接让MainActivity实现了OnClickListener这个接口. ...

  8. 局域网中使用的IP地址有哪些?

    当我们建设一个局域网的时候,需要为网络中的每台计算机分配一个IP地址.那么都有哪些IP地址可以使用在局域网中呢?局域网中的IP地址有什么规定呢? 在局域网中,我们是不能使用如202.106.45.11 ...

  9. hbase-0.98.1-cdh5.1.0伪分布式安装

    分三步: 1. 添加环境变量 2.编辑hbase-env.sh文件 3.编辑hbase-site.xml 文件 前提条件是安装好hadoop,下面展开说明 1. 添加环境变量 export HBASE ...

  10. N72烧写

    1.打开MFGTOOL.exe烧写工具:上电之前,先短接左下脚,当查看到MFGTOOL工具扫描到工具之后,点击开始,过2分钟左右烧写完成:完成之后电源要拔插以下!! 2.利用---生产工具V1.3 2 ...