@ysner
2018-05-19T09:05:11.000000Z
字数 1703
阅读 2420
暴力
她的面前浮现出一个长度为的序列,她想找出一段区间()。
这个特殊区间满足,存在一个(),并且对于任意的(),都能被整除。这样的一个特殊区间价值为。
小想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢?这些
区间又分别是哪些呢?
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define ll long long#define re register#define il inline#define max(a,b) (a>b?a:b)#define min(a,b) (a<b?a:b)#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int N=5e5+100;int n,a[N],l,r,tot,ans=0,sol[N],cnt,now;bool vis[N];il int gi(){re int x=0,t=1;re char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;}il void wri(re int x){if(x<0) putchar('-'),x=-x;if(x>9) wri(x/10);putchar(x%10+'0');}il void work(re int i){if(vis[i]) return;vis[i]=1;l=r=i;while(l>1){l--;if(a[l]%a[i]!=0) {l++;break;}else vis[l]=1;}while(r<n){r++;if(a[r]%a[i]!=0) {r--;break;}else vis[r]=1;}if(ans<r-l) ans=r-l,sol[tot=1]=l;else if(ans==r-l) sol[++tot]=l;}int main(){freopen("pair.in","r",stdin);freopen("pair.out","w",stdout);n=gi();tot=n;fp(i,1,n) sol[i]=i;fp(i,1,n) a[i]=gi();if(n>3000){re int gaoshi=min((1e8/n),(n+100));fp(i,1,gaoshi-1) work(n/gaoshi*i);}fp(i,1,n) work(i);sort(sol+1,sol+1+tot);re int ysn=0;//printf("%d\n",tot);fp(i,1,tot) if(sol[i]==sol[i-1]) ysn++;printf("%d %d\n",tot-ysn,ans);fp(i,1,tot) if(sol[i]!=sol[i-1]) printf("%d ",sol[i]);printf("\n");fclose(stdin);fclose(stdout);return 0;}
