http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=48388

前段时间偶然碰到的一道题,今天突然想到没把它记录下来。

比较不错的扩展欧几里德求解的应用

题意求是否满足ax+by=c gcd(a,b)==1 a>=0&&b>=0

数比较大 在求解时LL会溢出,用JAVA改写了一遍程序。

扩展欧几里德可以求出一组满足条件的解p= p1+b/gcd(a,b)*t q = q1+a/gcd(a,b)*t (t为任意整数)

因为上面的解有条件 所以根据p>=0 q>=0可以确定出来t的范围 在范围内枚举t可以求出解来 判断是否满足条件即可。

注意一下特殊情况,为0的情况。

 import java.text.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.applet.*;
public class Main
{
static BigInteger x,y,o = BigInteger.valueOf(0),o1 = BigInteger.valueOf(1);
static BigInteger gcd(BigInteger a,BigInteger b)
{
if(b.compareTo(BigInteger.valueOf(0))==0)
return a;
else
return gcd(b,a.mod(b));
}
static BigInteger exgcd(BigInteger a,BigInteger b)
{
if(b.compareTo(o)==0)
{
x = o1; y = o; return a;
}
BigInteger d = exgcd(b,a.mod(b));
BigInteger temp = x;
x = y;
y = temp.subtract(a.divide(b).multiply(y)) ;
return d;
}
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
BigInteger a,b,c;
while(cin.hasNext())
{
a = cin.nextBigInteger();
b = cin.nextBigInteger();
c = cin.nextBigInteger();
if(c.compareTo(a)<0&&c.compareTo(b)<0)
{
System.out.println("NO");
continue;
}
BigInteger o = BigInteger.valueOf(0);
if(a.compareTo(o)==0||b.compareTo(o)==0)
{
if(a.compareTo(o)==0&&b.compareTo(o)==0)
{
if(c.compareTo(o)==0)
System.out.println("YES");
else
System.out.println("NO");
}
else if(a.compareTo(o)==0)
{
if(c.mod(b).compareTo(o)==0)
System.out.println("YES");
else
System.out.println("NO");
}
else
{
if(c.mod(a).compareTo(o)==0)
System.out.println("YES");
else
System.out.println("NO");
}
continue;
}
if(c.compareTo(b)==0||c.compareTo(a)==0)
{
System.out.println("YES");
continue;
}
BigInteger t = gcd(a,b);
if(c.mod(t).compareTo(o)!=0)
{
System.out.println("NO");
continue;
}
exgcd(a,b);
x = x.multiply(c.divide(t));
y = y.multiply(c.divide(t));
BigInteger k1 = b.divide(t);
BigInteger k2 = a.divide(t);
int flag = 0;
BigInteger tx=x,ty=y;
BigInteger f1 = (x.multiply(BigInteger.valueOf(-1))).divide(k1).subtract(BigInteger.valueOf(1));
BigInteger f2 = y.divide(k2).add(BigInteger.valueOf(1));
BigInteger e = f1;
while(e.compareTo(f2)<=0)
{
tx = k1.multiply(e).add(x);
ty = k2.multiply(e);
ty = y.subtract(ty);
if(tx.compareTo(o1)>=0&&ty.compareTo(o1)>=0)
{
if(gcd(tx,ty).compareTo(BigInteger.valueOf(1))==0)
{
//System.out.println(tx+" "+ty);
flag = 1;
break;
}
}
e = e.add(BigInteger.valueOf(1));
}
if(flag==1)
System.out.println("YES");
else
System.out.println("NO");
}
}
}

UVALive - 6428(扩展欧几里德)的更多相关文章

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

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

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

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

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

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

  4. 51nod 1352 扩展欧几里德

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

  5. CF 7C. Line(扩展欧几里德)

    题目链接 AC了.经典问题,a*x+b*y+c = 0整数点,有些忘记了扩展欧几里德,复习一下. #include <cstdio> #include <iostream> # ...

  6. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  7. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  8. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

  9. HDU 1576 A/B【扩展欧几里德】

    设A/B=x,则A=Bx n=A%9973=A-9973*y=Bx-9973*y 用扩展欧几里德求解 #include<stdio.h> #include<string.h> ...

随机推荐

  1. 基于Ubuntu 14.04 LTS编译Android4.4.2源码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS ...

  2. leetcode 681. Next Closest Time

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  3. 【bzoj3282】Tree

    LCT模板题: 话说xor和的意思是所有数xor一下: #include<iostream> #include<cstdio> #include<cstring> ...

  4. p1199八数码问题

    oj上简化的八数码问题,最强的数据仅仅是20步: 根据曼哈顿距离构造启发函数: 主算法:IDA*:(使用方法好像不太对......) 未用位运算优化: #include<iostream> ...

  5. include <ctype.h> 头文件包含函数总结

    里面包含的函数主要是: 1.字符测试函数,函数原型一般为:int isXXXX( int ); 参数为int, 只能正确处理[0, 127]. 2.字符映射函数,函数原型一般为:int toXXXX( ...

  6. HDU4280 Island Transport —— 最大流 ISAP算法

    题目链接:https://vjudge.net/problem/HDU-4280 Island Transport Time Limit: 20000/10000 MS (Java/Others)   ...

  7. hash与map的区别联系应用(转)

    一,hashtable原理: 哈希表又名散列表,其主要目的是用于解决数据的快速定位问题.考虑如下一个场景. 一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个 ...

  8. WCF寄宿到Windows Service[1]

    WCF寄宿到Windows Service 返回 在前面创建一个简单的WCF程序,我们把WCF的服务寄宿到了Host这个控制台项目中了.下面将介绍如何把WCF的服务寄宿到Windows服务中(源代码) ...

  9. Spring Data JPA 和MyBatis比较

    现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者. Spring Data JPA 是Spring Data ...

  10. 文件的创建,读取,写入,修改,删除---python入门

    转自:http://blog.163.com/jackylau_v/blog/static/175754040201181505158356/ 一.用Python创建一个新文件,内容是从0到9的整数, ...