题目链接 - LeetCode:https://leetcode-cn.com/contest/weekly-contest-161/problems/check-if-it-is-a-good-array/
给你一个正整数数组 nums
,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。
假如该和结果为 1
,那么原数组就是一个「好数组」,则返回 True
;否则请返回 False
。@wowpH
示例 1:
输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 5 和 7。
5 × 3 + 7 × (-2) = 1
示例 2:
输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。@pfdvnah
29 × 1 + 6 × (-3) + 10 × (-1) = 1
示例 3:
输入:nums = [3,6]
输出:false
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
题解
裴(péi)蜀定理:任意整数a,b存在整数x,y使得ax+by=gcd(a,b)成立。
裴蜀定理推广:任意n个整数a1,a2,…,an,d是它们的最大公约数,存在n个整数x1,x2,…xn使得a1x2+a2x2+…+anxn=d成立。
Java代码
/**
* 链接:https://blog.csdn.net/pfdvnah/article/details/102895071
* 作者:wowpH pfdvnah
* 日期:2019年11月4日14:40:00
*/
class Solution {
public boolean isGoodArray(int[] nums) {
int g = nums[0];
for (int i = 1; i < nums.length; ++i) {
g = gcd(g, nums[i]);
}
return (1 == g);
}
private int gcd(int a, int b) {
return 0 == b ? a : gcd(b, a % b);
}
}
裴蜀定理 - 百度百科:https://baike.baidu.com/item/%E8%A3%B4%E8%9C%80%E5%AE%9A%E7%90%86/5186593
原文链接 - CSDN:https://blog.csdn.net/pfdvnah/article/details/102895071