bzoj 4052: [Cerc2013]Magical GCD
2015-05-13 17:02
483 查看
Description
给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12。求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。
Input
Output
Sample Input
15
30 60 20 20 20
Sample Output
80因为不同gcd数量很少。所以直接暴力即可
#include<vector> #include<cstdio> #include<algorithm> using namespace std; struct save { long long num; int x; bool operator <(save y) const { return num<y.num||(num==y.num&&x<y.x); } }; long long a[100001]; save f[2][100001]; inline long long gcd(long long x,long long y) { long long m=x%y; while(m!=0) { x=y; y=m; m=x%y; } return y; } int main() { int T; scanf("%d",&T); while(T>0) { T--; int n; scanf("%d",&n); int i,j,k; for(i=1;i<=n;i++) scanf("%lld",&a[i]); long long ans=0; int p=0,q=1; int s1=0,s2=0; save d; for(i=1;i<=n;i++) { for(j=1;j<=s1;j++) f[p][j].num=gcd(a[i],f[p][j].num); d.num=a[i]; d.x=i; s1++; f[p][s1]=d; sort(f[p]+1,f[p]+s1+1); s2=0; for(j=1;j<=s1;j++) { if(f[p][j].num!=f[p][j-1].num) { s2++; f[q][s2]=f[p][j]; } } for(j=1;j<=s2;j++) ans=max(ans,f[q][j].num*(long long)(i-f[q][j].x+1)); p^=1; q^=1; s1=s2; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- bzoj 4052: [Cerc2013]Magical GCD
- 【BZOJ】【4052】【CERC2013】Magical GCD
- 【BZOJ4052】【Cerc2013】Magical GCD 单调栈
- bzoj 4052: [Cerc2013]Magical GCD 暴力
- BZOJ 4052 Cerc2013 Magical GCD
- 【BZOJ 4052】[Cerc2013]Magical GCD 暴力+gcd
- 【数论】【暴力】bzoj4052 [Cerc2013]Magical GCD
- 【bzoj4052】[Cerc2013]Magical GCD 暴力
- 【BZOJ4052】[Cerc2013]Magical GCD 乱搞
- 【CERC2013】bzoj4052 Magical GCD
- [Cerc2013]Magical GCD
- BZOJ 4052 Magical GCD
- bzoj 4052: [Cerc2013]Magical GCD
- 【CERC2013】【BZOJ4052】Magical GCD
- BZOJ 4052: [Cerc2013]Magical GCD
- BZOJ 4052: [Cerc2013]Magical GCD
- BZOJ 4488/4052 gcd
- 4052: [Cerc2013]Magical GCD/4488: [Jsoi2015]最大公约数
- 4052: [Cerc2013]Magical GCD
- BZOJ 3122: [Sdoi2013]随机数生成器 ex_gcd+BSGS