传送门

发现这题选或不选对状态的优劣程度不会产生影响,如果已经确定了两个数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. 敏捷冲刺每日报告--day1

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  2. 20162323周楠《Java程序设计与数据结构》第八周总结

    20162323周楠 2016-2017-2 <程序设计与数据结构>第八周学习总结 教材学习内容总结 一个异常是一个对象,它定义了并不轻易出现的或是错误的情形 异常由程序或运行时环境抛出, ...

  3. 冲刺NO.7

    Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...

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

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

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

    上一个阶段的总结: 在Alpha阶段,我们小组已近完成了大部分的功能要求,小组的每一个成员都发挥了自己的用处.经过了这么久的磨合,小组的成员之间越来越默契,相信在接下来的合作中,我们的开发速度会越来越 ...

  6. JAVA_SE基础——49.多态的应用

    因为多态对以后开发的重要性,因此我在这里专门开个多态的应用来加深讲解,希望想弄懂多态的同学能耐心看完. 了解了对象多态性后,那么这多态到底有哪些用处了? 下面要求设计一个方法,要求此方法可以接受A类的 ...

  7. linux的slect的脚本适用于交互

    [rhuang@localhost ~]$ vi os.sh #!/bin/bash echo "What is your favourite OS?" select var in ...

  8. Python内置函数(49)——isinstance

    英文文档: isinstance(object, classinfo) Return true if the object argument is an instance of the classin ...

  9. Python-字符串及列表操作-Day2

    1.数据类型 1.1 变量引出数据类型 变量:用来记录状态变量值的变化就是状态的变化,程序运行的本质就是来处理一系列的变化 1.2 五大基本数据类型: 数字 字符串 列表 元组 字典 1.2.1 数字 ...

  10. 2.sublime设置本地远程代码同步

    1.打开编辑器输入框(Ctrl+Shift+P),并执行 2.回车后输入sftp 3.回车个后,右键项目 4.修改配置信息,保存