题意

题目链接

分析

  • 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系!

  • 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \(\log\) 次。

    比较显然,如果每次都变小的话至少都除以了因子 \(2\) ,变为原来的二分之一。

  • 所以考虑一个暴力分块,记录每一块的 \(\rm gcd\) G[i]、异或和X[i]、前缀异或和。

  • 如果 \({\rm gcd}(lastgcd,G[i])=lastgcd\) ,那么直接在该块记录的前缀异或和中查找\(\frac{val}{lastgcd}\ {\rm xor}\ lastxorv\) 的最小的值即可。

  • 总时间复杂度为 \(O(n\log n \sqrt n)\)。

重点:\(\rm gcd\) 的取值次数最多有 \(\log\) 次变化!

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
typedef pair<LL,int> pii;
const int N=1e5 + 7;
int n,sz;
int bl[N],a[N],G[N],X[N];
char s[N];
vector<pii>v[400];
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
void build(int z){
X[z]=0;v[z].clear();
rep(i, sz*(z-1)+1, min(sz*z,n)){
v[z].pb(make_pair(X[z]^=a[i],i));
G[z]=i==(sz*(z-1)+1)?a[i]:gcd(G[z],a[i]);
}
sort(v[z].begin(),v[z].end());
}
int query(LL val){
int lastg=a[1],lastx=0;
rep(i,1,sz){
lastg=i==1?a[1]:gcd(lastg,a[i]),lastx^=a[i];
if(1ll*lastg*lastx==val) return i;
}
rep(z,2,bl[n]){
if(gcd(lastg,G[z])==lastg){
LL to=(val/lastg)^lastx;lastx^=X[z];
if(val%lastg) continue;
int x=lower_bound(v[z].begin(),v[z].end(),make_pair(to,0))-v[z].begin();
if(x==v[z].size()) continue;
pii tmp=v[z][x];
if(tmp.first==to) return tmp.second;
}
else rep(i,sz*(z-1)+1,min(sz*z,n)){
lastg=gcd(lastg,a[i]),lastx^=a[i];
if(1ll*lastg*lastx==val) return i;
}
}
return 0;
}
int main(){
n=gi();sz=sqrt(n);
rep(i,1,n) a[i]=gi(),bl[i]=(i-1)/sz+1;
rep(z,1,bl[n]) build(z); int q=gi();
int x;LL y;
rep(i,1,q){
scanf("%s",s);
if(s[0]=='M') {
x=gi()+1,y=gi();
a[x]=y,build(bl[x]);
}else{
scanf("%lld",&y);
int res=query(y)-1;
if(res==-1) puts("no");
else printf("%d\n",res);
}
}
return 0;
}

[BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]的更多相关文章

  1. [BZOJ4028][HEOI2015]公约数数列(分块)

    先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...

  2. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  3. BZOJ 4028: [HEOI2015]公约数数列 分块

    4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...

  4. BZOJ4028 HEOI2015公约数数列(分块)

    前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...

  5. bzoj4028: [HEOI2015]公约数数列

    Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...

  6. 【BZOJ4028】[HEOI2015]公约数数列(分块)

    [BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...

  7. BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec   ...

  8. 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)

    闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...

  9. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

随机推荐

  1. [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]

    USING GIT IN XCODE KEEPING IN SYNC WITH REMOTE REPOSITORIES As you make changes in your local workin ...

  2. 数据库服务注册(使用命令注册):解决my.ini配置文件不存在的问题

    注册数据库的时候,有一键式安装,还有一种通过压缩包安装.今天主要来讲一下压缩包安装会出现的问题. 1. 新建一个my.ini文件,里面内容为: [client] port=3306 default-c ...

  3. My Heart Will Go On(我心永恒)

    My Heart Will Go On(我心永恒) 歌词(英文) 歌词(中文) 简介:电影<泰坦尼克号>插曲   歌手:Celine Dion(席琳·迪翁)   词作:韦尔·杰宁斯(Wil ...

  4. Mac Item2 设置别名 永久生效

    使用 Item2 终端, 设置 别名的时候, 按照 网上的说法, 是 去 修改 用户目录下的   .bashrc   或者  .bash_profile 这两个文件都可以, 把 alias 写在 这两 ...

  5. java 扁平化输出json所有节点key/value

    本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...

  6. Golang Http Server源码阅读

    建议看这篇文章前先看一下net/http文档 http://golang.org/pkg/net/http/ net.http包里面有很多文件,都是和http协议相关的,比如设置cookie,head ...

  7. 最简单的方式在linux上升级node.js版本

    node的升级频率太高,n模块来升级是最方便的,网上看了很多资料介绍使用n模块,但是安装n模块之后却经常找不到这个命令  很多同学安装之后直接去使用n会发现命令不存在,就停留在这一步无法前进了. 解决 ...

  8. 9、Android---UI---Material Design

    9.1.什么是Material Design 由谷歌的设计师基于传统优秀设计原则,结合丰富的创意和科学技术所发明的一套全新的界面设计语言 包含了视觉.运行.互动等效果 Material Design的 ...

  9. java 项目开启mysql binlog参数后报500错误:

    问题: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and ...

  10. C++矩阵库 Eigen 简介

    最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...