题目描述
出题人不喜欢数学,所以他决定把这个问题抛给你。
对于一个数组的连续的区间(l,r),如果min(al,al+1,...,ar)=gcd(al,al+1,...,ar),则称这个区间为好区间。
他将给你一个数组,该数组为一个排列,你需要求出数组中最长的好区间的长度。
min(al,al+1,...,ar)表示区间(l,r)中的最大元素,gcd(al,al+1,...,ar)表示区间(l,r)中所有元素的最大公因数。
一个长为n的排列是指一个包含n个元素的数组,其中从1到n每个整数都恰好出现一次。
特别的,规定区间的长度为1的min(ai)等于ai本身,区间的长度为1的gcd(ai)等于ai本身。
输入描述:
第一行包含一个整数T(1≤T≤104),代表样例数量。
接下来为T组样例。每组样例的第一行为一个整数n(1≤n≤5⋅1e5),表述数组的长度。
每组样例的第二行包含n个整数a1,a2,...,an(1≤ai≤1e9),表示他给你的数组。
保证所有样例的n的和不超过5*1e5
输出描述:
对于每个样例,输出一个整数ans表示最长的好区间的长度。
示例1
输入
复制
1 2 2 1
输出
复制
2
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int a[N];
int main(){
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<n<<endl;
}
return 0;
}
这个题更扯淡:
上个Highest Common Factor已经说过了
一个区间内最大公约数最大的时候便是等于区间内最大的那个值,那么现在这个题的定义改变了
要求区间的最小值和区间最大公约数相等时为好区间。
而现在的数组又是一个排列就是从1到n每个整数都会出现一次,那么就意味着区间中一定会有1
的出现,
那么他们的最大公约数就一定是1而且最小值也一定是1
那么这个数组就一定是一个好区间,则最长的就是这个数组的长度