CF359D Pair of Numbers gcd+暴力
2024-08-27 11:58:08
利用区间 gcd 个数不超过 log 种来做就可以了~
code:
#include <bits/stdc++.h>
#define N 300005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n;
set<int>s;
struct solve
{
int A[N],pos[N],len[N],gc[N],b[N],top,tmp;
void get()
{
int i,j;
for(i=1;i<=n;++i)
{
for(j=1;j<=top;++j) gc[j]=__gcd(gc[j], A[i]);
gc[++top]=A[i], pos[top]=i, b[tmp=1]=1;
for(j=2;j<=top;++j) if(gc[j]!=gc[j-1]) b[++tmp]=j;
for(top=0,j=1;j<=tmp;++j) gc[++top]=gc[b[j]], pos[top]=pos[b[j]];
len[i]=i-pos[top]+1;
}
}
}ori,rev;
int main()
{
// setIO("input");
int i,j,re=0,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&ori.A[i]);
for(i=1;i<=n;++i) rev.A[i]=ori.A[n-i+1];
ori.get(), rev.get();
for(i=1;i<=n;++i) re=max(re, ori.len[i]+rev.len[n-i+1]-2);
for(i=1;i<=n;++i) if(ori.len[i]+rev.len[n-i+1]-2==re) s.insert(i-ori.len[i]+1);
printf("%d %d\n",s.size(), re);
for(set<int>::iterator it=s.begin();it!=s.end();it++) printf("%d ",*it);
return 0;
}
最新文章
- 连载《一个程序猿的生命周期》- 44.感谢,我从事了IT相关的工作
- leetcode 165
- Python中的几种数据类型
- mysql关于字符串字段数据类型
- poj 2187
- PageLayoutControl的基本操作
- 【.NET】电话号码打星号(隐藏部分)
- JS中几种常见的数组算法(前端面试必看)
- 如何将ubuntu文件夹中文名改为英文
- RxJS核心概念之Subjet在angular2+上的应用
- Python——进程队列
- iOS强制横屏或强制竖屏
- curl重写php file_get_contents
- 一名3年工作经验的java程序员应该具备的职业技能
- 如何查看 Ubuntu下已安装包版本号
- ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法
- Android 应用程序之间内容分享详解(一)
- 科学计算三维可视化---Mayavi可视化实例
- CentOS7 tomcat systemctl脚本
- 【318】C# 学习笔记