zoukankan      html  css  js  c++  java
  • 牛客NOIP集训一S 牛牛的方程式 TJ

    题目链接

    思路

    这道题我们要求 (ax+by+cz=d) 是否有整数解 (x,y,z)
    我们可以先讨论 (ax + by = d) 是否有整数解,然后再看 (ax+by+cz=d) ,是否有整数解,
    于是我们可以考虑用裴蜀定理

    裴蜀定理

    (d=gcd(a ,b)),则存在整数 (x,y) 使得 (ax+by = d.)

    所以存在整数 (x,y) 使得 (ax+by = d.) 的条件是 (gcd(a,b)|d)
    接下来我们求出 (a,b) 的最大公约数即可,根据题目还有 (c),以此类推,我们只需要判断是否 (gcd(c,b)|d)(gcd(c,a)|d)
    综上所述,我们只需要判断是否 (gcd(a,b,c)|d) 即可

    P.S.如果想求出一组解需要用扩展欧几里得算法

    代码

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    int T;
    ll a ,b ,c ,d;
    ll gcd (ll r1 ,ll r2) {//欧几里得算法(辗转相除法)
    	while (r2) {
    		r1 %= r2;
    		swap (r1 ,r2);
    	}
    	return r1;
    }
    int main () {
    	scanf ("%d",&T);
    	while (T --) {
    		scanf ("%lld%lld%lld%lld",&a ,&b ,&c ,&d);
    		a = abs (a) ,b = abs (b) ,c = abs (c) ,d = abs (d);//注意可能会有负数
    		if (d == 0) {
    			puts ("YES"); continue;
    		}
    		ll cmp = gcd (a , gcd (b ,c));
    		if (cmp == 0) {
    			puts ("NO"); continue;
    		}
    		if (d % cmp != 0) {
    			puts ("NO"); continue;
    		}
    		puts ("YES");
    	}
    	return 0;
    }
    
    
    cb
  • 相关阅读:
    打包压缩文件命令
    用户与组管理命令
    cut 命令 通过列来提取文本字符
    linux文件拼接命令 paste
    shell 指定范围产生随机数
    shell 脚本随机抽取班级学生
    shell 输出九九乘法表
    shell 判断语句
    linux 排序命令sort
    linux之PATH环境变量
  • 原文地址:https://www.cnblogs.com/tuscjaf/p/13833961.html
Copyright © 2011-2022 走看看