zoukankan      html  css  js  c++  java
  • UVALive

    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的情况。

      1 import java.text.*;
      2 import java.io.*;
      3 import java.util.*;
      4 import java.math.*;
      5 import java.applet.*;
      6 public class Main 
      7 {
      8     static BigInteger x,y,o = BigInteger.valueOf(0),o1 = BigInteger.valueOf(1);
      9     static BigInteger gcd(BigInteger a,BigInteger  b)
     10     {
     11         if(b.compareTo(BigInteger.valueOf(0))==0)
     12             return a;
     13         else
     14             return gcd(b,a.mod(b));
     15     }
     16     static BigInteger exgcd(BigInteger a,BigInteger b)
     17     {
     18         if(b.compareTo(o)==0)
     19         {
     20             x = o1; y = o; return a;
     21         }
     22         BigInteger d = exgcd(b,a.mod(b));
     23         BigInteger temp = x;
     24         x = y;
     25         y = temp.subtract(a.divide(b).multiply(y))  ;
     26         return d;
     27     }
     28     public static void main(String[] args)
     29     {
     30         Scanner  cin = new Scanner(System.in);
     31         BigInteger a,b,c;
     32         while(cin.hasNext())
     33         {
     34             a = cin.nextBigInteger();
     35             b = cin.nextBigInteger();
     36             c = cin.nextBigInteger();
     37             if(c.compareTo(a)<0&&c.compareTo(b)<0)
     38             {
     39                 System.out.println("NO");
     40                 continue;
     41             }
     42             BigInteger o = BigInteger.valueOf(0);
     43             if(a.compareTo(o)==0||b.compareTo(o)==0)
     44             {
     45                 if(a.compareTo(o)==0&&b.compareTo(o)==0)
     46                 {
     47                     if(c.compareTo(o)==0)
     48                     System.out.println("YES");
     49                     else
     50                     System.out.println("NO");
     51                 }
     52                 else if(a.compareTo(o)==0)
     53                 {
     54                     if(c.mod(b).compareTo(o)==0)
     55                     System.out.println("YES");
     56                     else
     57                     System.out.println("NO");
     58                 }
     59                 else
     60                 {
     61                     if(c.mod(a).compareTo(o)==0)
     62                     System.out.println("YES");
     63                     else
     64                     System.out.println("NO");
     65                 }
     66                 continue;
     67             }
     68             if(c.compareTo(b)==0||c.compareTo(a)==0)
     69             {
     70                 System.out.println("YES");
     71                 continue;
     72             }
     73             BigInteger t = gcd(a,b);
     74             if(c.mod(t).compareTo(o)!=0)
     75             {
     76                 System.out.println("NO");
     77                 continue;
     78             }
     79             exgcd(a,b);
     80             x = x.multiply(c.divide(t));
     81             y = y.multiply(c.divide(t));
     82             BigInteger k1 = b.divide(t);
     83             BigInteger k2 = a.divide(t);
     84             int flag = 0;
     85             BigInteger tx=x,ty=y;
     86             BigInteger f1 = (x.multiply(BigInteger.valueOf(-1))).divide(k1).subtract(BigInteger.valueOf(1));
     87             BigInteger f2 = y.divide(k2).add(BigInteger.valueOf(1));
     88             BigInteger e = f1;
     89             while(e.compareTo(f2)<=0)
     90             {
     91                 tx = k1.multiply(e).add(x);
     92                 ty = k2.multiply(e);
     93                 ty = y.subtract(ty);
     94                 if(tx.compareTo(o1)>=0&&ty.compareTo(o1)>=0)
     95                 {
     96                     if(gcd(tx,ty).compareTo(BigInteger.valueOf(1))==0)
     97                     {
     98                         //System.out.println(tx+" "+ty);
     99                         flag = 1;
    100                         break;
    101                     }
    102                 }
    103                 e = e.add(BigInteger.valueOf(1));
    104             }
    105             if(flag==1)
    106             System.out.println("YES");
    107             else
    108             System.out.println("NO");
    109         }
    110     }
    111 }
    View Code
  • 相关阅读:
    【干货分享】C# 实体类生成工具
    ASP.NET Core部署系列二:发布到CentOS上
    ASP.NET Core部署系列一:发布到IIS上
    微信公众号开发:用户管理
    微信公众号开发:自定义菜单
    像使用SQL一样对List对象集合进行排序
    使用JRebel插件实现SpringBoot应用代码热加载
    Java Stream函数式编程图文详解(二):管道数据处理
    SpringBoot生命周期管理之停掉应用服务几种方法
    本月16日SpringBoot2.2发布,有哪些变化先知晓
  • 原文地址:https://www.cnblogs.com/shangyu/p/3671863.html
Copyright © 2011-2022 走看看