HDU - 6025 Coprime Sequence
2018-04-07 22:47
489 查看
题意:给你一个序列,任意去掉一个,问整个序列的最大公约数。
前缀和,后缀和思想
求前缀最大公约数,后缀最大公约数,然后找gcd(前缀gcd,后缀gcd)中最大的。
具体思想:开两个数组,第一个数组a保存前缀gcd,a[i]表示,从1到i的最大公约数。第二个数组b保存后缀gcd,b[i]表示,从n到i的最大公约数。
去掉第i个数的最大公约数为gcd(a[i-1],b[i+1]).over!
代码:
前缀和,后缀和思想
求前缀最大公约数,后缀最大公约数,然后找gcd(前缀gcd,后缀gcd)中最大的。
具体思想:开两个数组,第一个数组a保存前缀gcd,a[i]表示,从1到i的最大公约数。第二个数组b保存后缀gcd,b[i]表示,从n到i的最大公约数。
去掉第i个数的最大公约数为gcd(a[i-1],b[i+1]).over!
//提高cin的效率 std::ios::sync_with_stdio(false);
代码:
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod = 1e9 + 7; const ll maxn = 100005; int l[maxn],r[maxn],num[maxn]; int main(){ std::ios::sync_with_stdio(false); int T;cin>>T; while(T--){ int n;cin>>n; for(int i=0;i<n;i++) cin>>num[i]; l[0] = num[0]; r[n-1] = num[n-1]; for(int i=1;i<n;i++) l[i] = __gcd(l[i-1],num[i]); for(int i=n-2;i>=0;i--) r[i] = __gcd(r[i+1],num[i]); int d = max(l[n-2],r[1]); for(int i=1;i<n-1;i++){ d = max(d,__gcd(l[i-1],r[i+1])); } cout<<d<<endl; } return 0; }
相关文章推荐
- HDU - 6025 Coprime Sequence(前缀,后缀,gcd)
- HDU 6025 Coprime Sequence(前缀后缀GCD问题)
- HDU 6025 Coprime Sequence
- HDU 6025 Coprime Sequence
- Coprime Sequence HDU - 6025
- HDU 6025 Coprime Sequence 前缀gcd + 后缀gcd
- Coprime Sequence HDU - 6025
- hdu 6025 Coprime Sequence (前后缀GCD)
- (HDU 6025 女生专场)Coprime Sequence 水题
- HDU - 6025 Coprime Sequence(给出一行数,去掉其中一个数,求这行数的最大的最大公约数(gcd)))
- HDU 6025 Coprime Sequence
- HDU 6025 Coprime Sequence (前后缀+GCD)
- hdu 6025 Coprime Sequence
- CSP认证训练题——Coprime Sequence HDU - 6025
- hdoj 6025 Coprime Sequence
- HDU - 4135 Co-prime (容斥原理典型题)
- hdu 5072 Coprime (容斥)
- 【HDU】4135 Co-prime(容斥原理简单应用 质因子的分解)
- Coprime HDU - 5072 单色三角形+莫比乌斯反演+容斥原理
- HDU 3388 Coprime(容斥原理+二分)