列表

详情


NC24479. 小睿睿的数列

描述

小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个

输入描述

第一行1个整数n,表示数列的长度
第二行n个正整数,第i个整数表示数列a_i

输出描述

一行1个整数,表示答案

示例1

输入:

5
1 1 1 1 1

输出:

1

说明:

存在且仅存在最长区间[1,5]满足条件

示例2

输入:

5
2 4 7 11 22

输出:

2

说明:

区间分别为:[1,2],[4,5]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 306ms, 内存消耗: 23372K, 提交时间: 2020-09-02 23:02:33

#include<bits/stdc++.h>
using namespace std;
int a[2000005];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    int ans1=0,ans2=0,l,r;
    for(int i=1;i<=n;i=r){
        for(l=i-1;l>=1&&a[l]%a[i]==0;l--);
        for(r=i+1;r<=n&&a[r]%a[i]==0;r++);
        if(r-l-1>ans1) ans1=r-l-1,ans2=1;
        else if(r-l-1==ans1) ans2++;
    }
    printf("%d\n",ans2);
}

C++11(clang++ 3.9) 解法, 执行用时: 264ms, 内存消耗: 23360K, 提交时间: 2020-09-03 21:30:52

#include<stdio.h>
int a[2000006];
int main()
{
	int n,ans=0,max=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(int i=0;i<n;)
	{
		int l=i,r=i;
		for(;l>=0&&a[l]%a[i]==0;l--);
		for(;r<n&&a[r]%a[i]==0;r++);
		if(r-l-1>max)
		{
			max=r-l-1;
			ans=1;
		}
		else if(r-l-1==max)
		{
			ans++;
		}
		i=r;
	}
	printf("%d",ans);
}

上一题