题目:
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。
假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。
思路:
裴蜀定理
若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,
特别地,一定存在整数x,y,使ax+by=d成立。
- 根据题目要求,ax+by=1,则gcd(a,b)=1,因为任选一些子集,所以推广裴蜀定理:
- 如果 互质,则一定满足
- 所以我们只要判断nums中所有数的最大公约数是不是1就可以了
- gcd(0,x)=x
class Solution {
public boolean isGoodArray(int[] nums) {
int x=0;
for(int i:nums) x=gcd(x,i);
return x==1;
}
public int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
}