【BZOJ4052】[Cerc2013]Magical GCD 乱搞
2017-08-24 08:35
246 查看
【BZOJ4052】[Cerc2013]Magical GCD
Description
给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12。求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。
Sample Input
15
30 60 20 20 20
Sample Output
80题解:先思考暴力的做法。我们从一个数开始往左扫,将所有使得gcd改变的位置都记录下来。由于gcd的每次改变都至少/2,所以这样的位置不超过log个。
那么我们直接从左往右扫,暴力维护所有使得gcd改变的位置即可。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int maxn=100010; int n,m,k; ll ans; struct node { int x; ll g; }p[maxn],q[maxn]; ll gcd(ll a,ll b) { return (!b)?a:gcd(b,a%b); } inline ll rd() { ll ret=0,f=1; char gc=getchar(); while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();} while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar(); return ret*f; } void work() { n=rd(),ans=0; int i,j; ll v; m=0; for(i=1;i<=n;i++) { v=rd(); for(j=1;j<=m;j++) p[j].g=gcd(p[j].g,v); p[++m].g=v,p[m].x=i; for(k=0,j=1;j<=m;j++) if(p[j].g>p[j-1].g) q[++k]=p[j]; for(j=1;j<=k;j++) p[j]=q[j],ans=max(ans,(i-p[j].x+1)*p[j].g); m=k; } printf("%lld\n",ans); } int main() { int T=rd(); while(T--) work(); return 0; }
相关文章推荐
- 【BZOJ4052】【Cerc2013】Magical GCD 单调栈
- BZOJ 4052 Cerc2013 Magical GCD
- bzoj 4052: [Cerc2013]Magical GCD
- 【数论】【暴力】bzoj4052 [Cerc2013]Magical GCD
- bzoj 4052: [Cerc2013]Magical GCD 暴力
- bzoj 4052: [Cerc2013]Magical GCD
- 【bzoj4052】[Cerc2013]Magical GCD 暴力
- 【BZOJ】【4052】【CERC2013】Magical GCD
- 【BZOJ 4052】[Cerc2013]Magical GCD 暴力+gcd
- BZOJ 4052: [Cerc2013]Magical GCD
- BZOJ 4052 Magical GCD
- 【CERC2013】bzoj4052 Magical GCD
- [Cerc2013]Magical GCD
- bzoj 4052: [Cerc2013]Magical GCD
- 【CERC2013】【BZOJ4052】Magical GCD
- BZOJ 4052: [Cerc2013]Magical GCD
- BZOJ4053 : [Cerc2013]Subway
- 4052: [Cerc2013]Magical GCD
- 4052: [Cerc2013]Magical GCD/4488: [Jsoi2015]最大公约数
- BZOJ 4488/4052 gcd