传送门

发现这题选或不选对状态的优劣程度不会产生影响,如果已经确定了两个数a和b,那么最优的首项和公比也都是唯一确定的,

与对于后面的数x,加进去也好不加进去也好,首项和公比依旧是原来的

于是我们用尺取算法,用两个指针来扫一遍,

如果只有一个数且下一个数能被整除,就加进去,然后确定首项和公比

如果只有一个数且下一个数不能整除,两个指针直接指向下一个数

如果有多个数且下一个数满足公式,就加进来

如果有多个数且下一个数不满足公式,两个指针直接指向下一个数

这样对于最优解,一定是可以找到的

顺便说下最优的公比和首项的确定:

已知两个数x y,求满足它们的最优的首项 公比

设x=a*q^k1 y=a*q^k2 且x>y

那么x/y得到q^(k1-k2),

由于最优的公比一定尽可能小,所以要使指数尽可能大,就把q质因数分解,指数取gcd提出

这样就得到了公比,拿这个公比不断地除以一开始的x,就得到了首项

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define ll long long
#define MAXN 100005
using namespace std; ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
set<ll> s;
ll a[MAXN];
int gcd(int x,int y){
return (y==?x:gcd(y,x%y));
}
ll Pow(ll x,ll y){
ll ret=;
while(y){
if(y&){
ret*=x;
}
x*=x;
y>>=;
}
return ret;
}
int gt(ll x,ll y,ll &b,ll &q){
ll t=x/y;
if(==t){
b=x,q=;
return ;
}
vector<pii> vs;
for(int i=;i<=;i++){
if(t%i==){
int cnt=;
while(t%i==){
cnt++;
t/=i;
}
vs.push_back(make_pair(i,cnt));
}
}
if(t>){
return -;
}
int g=vs[].second;
for(int i=;i<vs.size();i++){
g=gcd(g,vs[i].second);
}
q=;
for(int i=;i<vs.size();i++){
q*=Pow((ll)vs[i].first,(ll)vs[i].second/g);
}
b=y;
while(b%q==){
b/=q;
}
return ;
}
int check(ll x,ll b,ll q){
if(x%b){
return ;
}
if(q==){
return (x==b);
}
if(s.count(x)){
return ;
}
x/=b;
ll t=q;
int L=,R=log(1.0*x)/log(1.0*q)+;
while(R-L>){
int mid=(L+R)/;
ll t=Pow(q,(L+R)/);
if(t>=x){
R=mid;
}
else{
L=mid;
}
}
if(Pow(q,L)==x||Pow(q,R)==x){
return ;
}
return ;
}
int main()
{
// freopen("seq2.in","r",stdin);
// freopen("seq.out","w",stdout);
n=read();
for(int i=;i<=n;i++){
a[i]=read();
}
int L=,R=;
int ans=;
ll b=,q=;
s.insert(a[]);
for(int i=;i<=n;i++){
ll t1=a[R],t2=a[i];
if(t1<t2){
swap(t1,t2);
}
if(t1%t2!=){
s.clear();
s.insert(a[i]);
L=i,R=i;
continue;
}
if(L==R){
R++;
s.insert(a[R]);
if(-==gt(t1,t2,b,q)){
L++;
s.clear();
s.insert(a[L]);
}
}
else if(check(a[i],b,q)){
R++;
if(q!=)
s.insert(a[R]);
}
else{
s.clear();
s.insert(a[i]);
L=i,R=i;
}
ans=max(ans,R-L+);
}
printf("%d\n",ans);
return ;
}

计蒜客NOIP2017提高组模拟赛(五)day1-展览的更多相关文章

  1. 计蒜客NOIP2017提高组模拟赛(三)day1

    火山喷发 火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 n 个生物分别具有 A​1​​,A​2​​,⋯,A​n​​点生命值,一次火山喷发总计 MM 轮 ...

  2. 计蒜客NOIP2017提高组模拟赛(四)day1

    T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...

  3. 计蒜客NOIP2017提高组模拟赛(五)day1-机智的 AmyZhi

    传送门 很水的题目啦QAQ #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...

  4. 计蒜客NOIP2017提高组模拟赛(五)day2-蚂蚁搬家

    传送门 这题可以用线段树来维护 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...

  5. 计蒜客NOIP2017提高组模拟赛(五)day2-成绩统计

    传送门 用hash,因为map的复杂度可能在这题中因为多一个log卡掉,但是hash不会 可能因为这个生成的随机数有循环的情况,不是完全均匀的 而且这题hash表的长度也可以开的很大 #include ...

  6. 计蒜客NOIP2017提高组模拟赛(三)day2-数三角形

    传送门 这题有点坑啊 设A为两边颜色不同的角,B为两边颜色相同的角 那么考虑三种三角形:异色,同色,其他 对于任何一个异色三角形,一定会有三个颜色不同的角, 对于任何一个同色三角形,一定会有零个颜色不 ...

  7. 计蒜客NOIP2017提高组模拟赛(三)day2-直线的交点

    传送门 简单几何+逆序对 发现当两条直线甲乙与平板的交点在上面甲在较左的位置,那么下面甲在较右的位置就可以相交 然后把上面的位置排下序,下面离散化+树状数组即可 #include<cstdio& ...

  8. 计蒜客NOIP2017提高组模拟赛(三)day2-小区划分

    传送门 dp,注意边界 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...

  9. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

随机推荐

  1. Build to win--来自小黄衫

    写在前面 首先非常荣幸.非常侥幸能以微弱的优势得到这次小黄衫,感谢各位老师同学的帮助,也谢谢来自<构建之法>团队的小黄衫赞助! 这次能够获得小黄衫,就像汪老师上课说的那样,其实,是一个积累 ...

  2. 团队作业7-Beta版本冲刺计划及安排

    a.下一阶段需要改进完善的功能 对部分bug的修改,主要是在未登录时页面跳转的问题以及防止通过对数据库进行注入查询. b.下一阶段新增的功能 1.活动页面,提示打折信息等. 2.商家修改打折信息 3. ...

  3. C语言--第三周作业

    一.PTA作业中4个题目 1.7-9 A乘以B 要求:输入的两个整数:A是你学号前两位数字,B是你学号后两位数字 a.代码 #include <stdio.h> int main () { ...

  4. 201621123043《java程序设计》第4周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:继承.覆盖.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用 ...

  5. JAVA_SE基础——62.String类的构造方法

    下面我先列出初学者目前用到的构造方法 String 的构造方法:     String()  创建一个空内容 的字符串对象.   String(byte[] bytes)  使用一个字节数组构建一个字 ...

  6. JAVA_SE基础——23.类的定义

    黑马程序员入学blog ... java 面向对象的语言 对象:真实存在的唯一的实物. 比如:我家的狗, 类: 实际就是对某种类型事物的共性属性与行为的抽取.  抽象的概念...   比如说:车   ...

  7. js前端对后台数据的获取,如果是汉字则需要添上引号

    js前端对后台数据的获取,如果是汉字则需要添上引号

  8. typescript简介

    微软作为编译器狂魔一直有一个心病,就是改良JavaScript这种语法超级烂又很多人用的编程语言,于是TypeScript诞生了 先做个对比吧:   TS JS 语法严谨性 严谨 宽松 静态性 静态 ...

  9. windows安装tensorflow简单直接的方法(win10+pycharm+tensorflow-gpu1.7+cuda9.1+cudnn7.1)

    安装tensorflow-gpu环境需要:python环境,tensorflow-gpu包,cuda,cudnn 一,安装python,pip3直接到官网下载就好了,下载并安装你喜欢的版本 https ...

  10. PHP类的自动加载

    spl_autoload_register(function ($className) { require str_replace('\\', '/', $className '.php'); }) ...