一个数的约数大概是log级的,那么右端点确定的若干区间的gcd最多也只有log种。显然,右端点确定时,随着左端点递增,gcd是不降的。
从左往右DP,对于每种以当前点为右端点的区间gcd的取值,记录左端点最左可以延伸到哪。用map搞个映射就好了。复杂度O(nlog^2n)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define ll long long
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
using namespace std;
typedef map<ll,int&g