CodeForces

来源:互联网 发布:剑三眉间雪捏脸数据 编辑:程序博客网 时间:2024/06/05 19:40
D. Pair of Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Simon has an array a1, a2, ..., an, consisting of n positive integers. Today Simon asked you to find a pair of integers l, r (1 ≤ l ≤ r ≤ n), such that the following conditions hold:

  1. there is integer j (l ≤ j ≤ r), such that all integers al, al + 1, ..., ar are divisible by aj;
  2. value r - l takes the maximum value among all pairs for which condition 1 is true;

Help Simon, find the required pair of numbers (l, r). If there are multiple required pairs find all of them.

Input

The first line contains integer n (1 ≤ n ≤ 3·105).

The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 106).

Output

Print two integers in the first line — the number of required pairs and the maximum value of r - l. On the following line print all l values from optimal pairs in increasing order.

Examples
input
54 6 9 3 6
output
1 32 
input
51 3 5 7 9
output
1 41 
input
52 3 5 7 11
output
5 01 2 3 4 5 
Note

In the first sample the pair of numbers is right, as numbers 6, 9, 3 are divisible by 3.

In the second sample all numbers are divisible by number 1.

In the third sample all numbers are prime, so conditions 1 and 2 are true only for pairs of numbers (1, 1)(2, 2)(3, 3)(4, 4)(5, 5).


题意: n个数 找出一个尽量长的区间l和r 使得l和r中的一个数可以整除区间里的所有数
输出:
区间的个数(如果最长区间有多个则输出多个) 区间的长度-1
区间的左边界

思路:枚举每一个数的左边界和右边界,但是根据数据范围可以得出不可以用n方的算法,会超时,所以在处理左右边界可以优化一下。其他的就比较简单了。下面贴上两种代码

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define N 300005using namespace std;int a[N],ans[N];int main(){int i,l,r,n;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&a[i]);int cnt=0;int len=0;for(i=1;i<=n;){l=i;r=i;while(l>=1&&a[l]%a[i]==0) l--;while(r<=n&&a[r]%a[i]==0) r++;l++;r--;//printf("left : %d right : %d\n",l,r);i=r+1;int num=r-l;if(num==len) ans[++cnt]=l;else if(num>len){cnt=0;len=num;ans[++cnt]=l;}}printf("%d %d\n",cnt,len);for(i=1;i<=cnt;i++){if(i==cnt) printf("%d\n",ans[i]);else printf("%d ",ans[i]);}return 0;}

第二种最后输出要注意一下.
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define N 300005using namespace std;int a[N],ans[N],ll[N],rr[N];int n;void init(){int i;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);ll[i]=rr[i]=i;}return ;}void output(){int i,j,left,right;int Ans=0,len=0;for(i=1;i<=n;++i)    {        left=ll[i];right=rr[i];        if(right-left==len)ans[++Ans]=left;        if(right-left>len)len=right-left,ans[Ans=1]=left;    }    int xllend3=0;    sort(ans+1,ans+Ans+1);    for(i=1;i<=Ans;++i)if(ans[i]!=ans[i-1])++xllend3;    printf("%d %d\n%d",xllend3,len,ans[1]);    for(i=2;i<=Ans;++i)if(ans[i]!=ans[i-1])printf(" %d",ans[i]);    printf("\n");}int main(){int i,j,l,r;init();int maxx=0;int cnt=0;for(int i=1;i<=n;++i)for(;ll[i]>1&&a[ll[i]-1]%a[i]==0;)ll[i]=ll[ll[i]-1];    for(int i=n;i>=1;--i)for(;rr[i]<n&&a[rr[i]+1]%a[i]==0;)rr[i]=rr[rr[i]+1];output();return 0;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 军训戴眼镜晒痕怎么办 想进部队体检没过怎么办 大腿跟小腿不直怎么办 腿被车门夹了怎么办 脚出汗穿凉鞋滑怎么办 玩游戏手出汗屏幕滑怎么办 新买的鞋子臭怎么办 当公民利益受到侵犯怎么办 唇钉里面长肉怎么办 宝宝舔了一口酒怎么办 头被玻璃门撞了怎么办 30多了还一事无成 未来怎么办 27岁失业了该怎么办 无业证明不给开怎么办 典型的缺乏运动的肥胖怎么办 30岁了不想结婚怎么办 专家解释欠30万怎么办 欠医院十几万钱怎么办 当你迷茫的时候怎么办 被骗了一年的积蓄怎么办 当兵身高视力都不够怎么办 当兵中途不想当了怎么办 当兵后不想当了怎么办 在泰国想剪头发怎么办 省二证书丢了怎么办 职称计算机级别报错怎么办 科一不会用电脑怎么办 西安科目三挂了怎么办 我有c照想考a照怎么办 叉车证单位不给怎么办 刚练科目三害怕怎么办 摩托科目一考不过怎么办 人老了视力不好怎么办 2岁宝宝视力不好怎么办 唱歌音总是唱不准怎么办 考级没地方练琴怎么办 少儿声乐唱不准音该怎么办 学历认证报告编号忘记了怎么办 自考挂科10门了怎么办 高中的会考没过怎么办 毕业证和学位证丢了怎么办