UVALive - 6428(扩展欧几里德)
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(扩展欧几里德)的更多相关文章
- (扩展欧几里德算法)zzuoj 10402: C.机器人
		10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ... 
- [BZOJ1407][NOI2002]Savage(扩展欧几里德)
		题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ... 
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
		欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ... 
- 51nod 1352 扩展欧几里德
		给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ... 
- CF 7C. Line(扩展欧几里德)
		题目链接 AC了.经典问题,a*x+b*y+c = 0整数点,有些忘记了扩展欧几里德,复习一下. #include <cstdio> #include <iostream> # ... 
- poj2142-The Balance(扩展欧几里德算法)
		一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ... 
- poj2115-C Looooops(扩展欧几里德算法)
		本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ... 
- poj1061-青蛙的约会(扩展欧几里德算法)
		一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ... 
- HDU 1576 A/B【扩展欧几里德】
		设A/B=x,则A=Bx n=A%9973=A-9973*y=Bx-9973*y 用扩展欧几里德求解 #include<stdio.h> #include<string.h> ... 
随机推荐
- 汉字与区位码互转(天天使用Delphi的String存储的是内码,Windows记事本存储的文件也是内码),几个常见汉字的各种编码,utf8与unicode的编码在线查询,附有读书笔记 good
			汉=BABA(内码)=-A0A0=2626(区位码)字=D7D6(内码)=-A0A0=5554(区位码) 各种编码查询表:http://bm.kdd.cc/ 汉(记住它,以后碰到内存里的数值,就会有敏 ... 
- [Selenium] Android HTML5 中 Web Storage
			在 HTML5 中,Web Storage 这个新特性可让用户将数据存储在本地的浏览器中.在早期的浏览器中可通过 cookies 来完成这个任务,但 Web Storage 会更加安全和高效,且 We ... 
- [Selenium] 操作浏览器前进后退
			driver.get("http://1.com"); driver.navigate().to("http://2.com"); driver.navigat ... 
- codevs1258关路灯
			传送门 1258 关路灯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他 ... 
- AES加密算法(C++实现,附源码)
			原创作品,转载请注明出自xelz's blog 博客地址:http://mingcn.cnblogs.com/ 本文地址:http://mingcn.cnblogs.com/archive/2010/ ... 
- UI:动画
			参考 UIView 层级管理.触摸.检测手机是否横屏.调整设备的方向 动画:为了提高用户的体验 View层的动画.UIlayer层的动画.UIView改变视图效果.UIlayer的绘图框架 #prag ... 
- sublime text 3中修改tab键为缩进4个空格
			1. 菜单栏里点击 Preferences-> Setting-User, 如图 2. 在弹出来的文本里,添加如下两行: { // 注意只有一个大括号,如果之前有属性,如在之前的属性后确保有 , ... 
- java web url编码解码问题(下载中文名文件)
			问题描述:需要url直接访问中文名的文件,类似于在地址栏里直接输入http://localhost:8080/example/丽江旅游攻略.doc 来进行文件下载,tomcat的server.xml文 ... 
- C#(KeyChar和KeyCord值,KeyDown/KeyPress事件区别)
			1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加:2. 添加KeyPress / KeyDown事件: KeyPress 和KeyDown .KeyPr ... 
- 洛谷 - P2578 - 九数码游戏 - bfs
			https://www.luogu.org/problemnew/show/P2578 一个挺搞的东西,用康托展开做记忆化搜索可以少一个log的查询. #include <bits/stdc++ ... 
