博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4488: [Jsoi2015]最大公约数
阅读量:5337 次
发布时间:2019-06-15

本文共 1311 字,大约阅读时间需要 4 分钟。

思路:容易发现以某个位置\(i\)为结尾所有后缀的\(gcd\)个数不超过\(log(a[i])\)
(怎么发现?将数写成质因子幂次乘积的形式,然后\(gcd\)每次减小一个质因子,最多减少\(log\)次)然后就可以用\(map\)维护每个\(gcd\)的最左端端点。
代码:

#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include
using namespace std;#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pii pair
#define piii pair
#define mem(a, b) memset(a, b, sizeof(a))#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);//headconst int N = 1e5 + 5;LL a[N];map
mp, _p;int n; int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); LL ans = 0; for (int i = 1; i <= n; ++i) { ans = max(ans, a[i]); for (map
::iterator it = mp.begin(); it != mp.end(); ++it) { LL g = __gcd(a[i], (*it).fi); ans = max(ans, g*(i-(*it).se+1)); if(_p.find(g) == _p.end()) _p[g] = (*it).se; } if(_p.find(a[i]) == _p.end()) _p[a[i]] = i; mp = _p; _p.clear(); } printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/widsom/p/11257109.html

你可能感兴趣的文章
Kafka TimeoutException: Batch Expired 问题排查
查看>>
RabbitMq(三)交换机类型
查看>>
基本矩张量与strike.dip.rake的对应
查看>>
Android EditText常用属性
查看>>
OpenCV training program, part 1: Official OpenCV Tutorial in C++
查看>>
pyCharm django 中新加app
查看>>
接口测试总结
查看>>
luogu 电车
查看>>
vijos 拓扑编号
查看>>
前端面试题目
查看>>
404. Sum of Left Leaves
查看>>
大小端以及字节序的问题
查看>>
[Leetcode 216]求给定和的数集合 Combination Sum III
查看>>
助教小结1
查看>>
[NOI2009]二叉查找树
查看>>
ASP.NET 配置文件加密
查看>>
JAVA设计模式之适配器模式
查看>>
P2672 推销员
查看>>
二分法查找
查看>>
全面解析Java注解
查看>>