BZOJ 4052: [Cerc2013]Magical GCD
2015-10-22 00:09
537 查看
以一个数字开头的子序列的gcd种类不会超过logn种,因此去找相同gcd最长的位置,更新一下答案,复杂度O(nlogn^2)
#include<cstdio> #include<algorithm> #include<cmath> #define N 300010 using namespace std; int n,i,Log ,j,l,left,right,mid; long long s [20],ans; long long gcd(long long a,long long b) { if (b==0) return a; return gcd(b,a%b); } long long Q(int l,int r) { int k=Log[r-l+1]; return gcd(s[l][k],s[r-(1<<k)+1][k]); } int main() { int test; scanf("%d",&test); while (test--) { ans=0; scanf("%d",&n); for (i=1;i<=n;i++) scanf("%lld",&s[i][0]); for (i=1;i<=n;i++) Log[i]=log2(i); for (i=n;i>=1;i--) for (j=1;j<=Log ;j++) s[i][j]=gcd(s[i][j-1],s[i+(1<<(j-1))][j-1]); for (i=1;i<=n;i++) { l=i; while (l<=n) { left=l; right=n; while (left<=right) { mid=(left+right)>>1; if (Q(i,mid)==Q(i,l)) left=mid+1; else right=mid-1; } l=right+1; ans=max(ans,(right-i+1)*Q(i,right)); } } printf("%lld\n",ans); } }
相关文章推荐
- surfaceView
- [每日一答] [20151020] 中文乱码,修改文件编码的方法
- 业务层
- 10008---SpringMVC 使用 Servlet API 作为入参
- [每日一答] [20151019] R语言中的正则表达式
- 【算法设计与数据结构】欧几里得算法、拓展欧几里得算法
- android 键盘的弹出与隐藏
- POJ 2699 最大流 竞赛图
- 国外程序员推荐:每个程序员都应读的书
- String StringBuilder StringBuffer 对比 总结得非常好
- C++ int 转换成 string intToString
- 迷宫寻宝(搜索)
- LNMP的技术讲解
- 丰田汽车的 Linux 之旅
- JSP页面文件中base标记用法实例分析
- WEB开发时常用的正则表达式(PHP和Javscript)
- 比较全面的C 、Java、JavaScript中的正则表达式详解
- Java正则表达式过滤出字母、数字和中文
- ASP.NET预定义模板介绍
- ASP.NET4的自动启动特性浅析