计蒜客NOIP2017提高组模拟赛(五)day1-展览
传送门
发现这题选或不选对状态的优劣程度不会产生影响,如果已经确定了两个数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-展览的更多相关文章
- 计蒜客NOIP2017提高组模拟赛(三)day1
火山喷发 火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 n 个生物分别具有 A1,A2,⋯,An点生命值,一次火山喷发总计 MM 轮 ...
- 计蒜客NOIP2017提高组模拟赛(四)day1
T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...
- 计蒜客NOIP2017提高组模拟赛(五)day1-机智的 AmyZhi
传送门 很水的题目啦QAQ #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...
- 计蒜客NOIP2017提高组模拟赛(五)day2-蚂蚁搬家
传送门 这题可以用线段树来维护 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...
- 计蒜客NOIP2017提高组模拟赛(五)day2-成绩统计
传送门 用hash,因为map的复杂度可能在这题中因为多一个log卡掉,但是hash不会 可能因为这个生成的随机数有循环的情况,不是完全均匀的 而且这题hash表的长度也可以开的很大 #include ...
- 计蒜客NOIP2017提高组模拟赛(三)day2-数三角形
传送门 这题有点坑啊 设A为两边颜色不同的角,B为两边颜色相同的角 那么考虑三种三角形:异色,同色,其他 对于任何一个异色三角形,一定会有三个颜色不同的角, 对于任何一个同色三角形,一定会有零个颜色不 ...
- 计蒜客NOIP2017提高组模拟赛(三)day2-直线的交点
传送门 简单几何+逆序对 发现当两条直线甲乙与平板的交点在上面甲在较左的位置,那么下面甲在较右的位置就可以相交 然后把上面的位置排下序,下面离散化+树状数组即可 #include<cstdio& ...
- 计蒜客NOIP2017提高组模拟赛(三)day2-小区划分
传送门 dp,注意边界 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
随机推荐
- C语言第九次作业
一.PTA实验作业 题目1:统计大于等于平均分人数 1. 本题PTA提交列表 2.设计思路 float i为循环变量,sum=0,count=0来表示所求人数 float *p=s来储存首地址 for ...
- Python多线程案例
from time import ctime,sleep import threading def music(): for i in range(2): print ("I was lis ...
- Java HashMap工作原理及实现
Java HashMap工作原理及实现 2016/03/20 | 分类: 基础技术 | 0 条评论 | 标签: HASHMAP 分享到:3 原文出处: Yikun 1. 概述 从本文你可以学习到: 什 ...
- day-1 用python编写一个简易的FTP服务器
从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...
- css3动画transition详解
一.transition-property 语法: transition-property : none | all | [ <IDENT> ] [ ',' <IDENT> ] ...
- python之路--day8---day9--两日内容
一.不使用函数的问题 1,代码的组织结构不清晰,可读性差 2,遇到重复的功能只能重复编写实现代码,代码冗余 3,功能需要扩展时,需要找出所有实现该功能的地方修改,无法统一管理且维护难度极大 二.函数是 ...
- EasyUI 动态创建对话框Dialog
// 拒绝审批通过 function rejectApproval() { // 创建填写审批意见对话框 $("<div id='reject-comment'> </di ...
- 大数据学习总结(5)参考elk技术架构
- ELK学习总结(1-3)倒排索引
1.倒排索引(反向索引) 一种索引方法,用来存储在全文检索下某个单词在一个/组文档中的存储位置. 常规索引,文档->关键词,费时,得把一个文档全部遍历一遍 倒排索引,关键词->文档,全文搜 ...
- OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...