题解 CF299A 【Ksusha and Array】

Ryan_

2019-10-04 21:44:56

Solution

第一道会题题解,也是通过的第一道灰题 题目大意:找出序列a中被所有数整除的数 思路非常简单,即求出所有数的最大公约数 ``` int long long GCD(int long long x,int long long y){ if(y==0)return x; return GCD(y,x%y); } //主函数 gcd[1]=a[1]; for(int i=2;i<=n;i++)gcd=GCD(gcd,a[i]); //这里不建议使用algorithm库里的__gcd函数,long long容易出现未知错误 ``` 看上面的大佬求出最大公约数还穷举了gcd的因子,其实多此一举 只需要判断gcd是否在序列a中就可以了 这里给出证明(口胡): 这里求出的gcd显然会小于等于数列a中最小的数 假设gcd存在一个因子满足条件,即这个因子出现在了数列a中,那么求得的gcd应该小于等于这个因子,矛盾 得证 csp rp--!!!~~反奶一口~~ AC code ``` #include<iostream> using namespace std; int n,a[1000005],gcd; int GCD(int x,int y){ if(y==0)return x; return GCD(y,x%y); } int main() { scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); gcd=a[1]; for(int i=2;i<=n;i++) gcd=GCD(gcd,a[i]); for(int i=1;i<=n;i++) { if(a[i]==gcd) { printf("%d",&a[i]); return 0; } } printf("-1"); return 0; } ```