题目描述

给定一个长度为n的序列$a_1,a_2...a_n$,其中每个数都是正整数。

你需要找出有多少对(i,j),$1 \leq i \leq j \leq n$且$gcd(a_i,a_{i+1}...a_j)~xor~(a_i~or~a_{i+1}~or~...~or~a_j)=k$,其中xor表示二进制异或,or表示二进制或。
输入输出格式
输入格式:

第一行两个整数n、k。

第二行n个整数$a_1,a_2...a_n$。

输出格式:

输出合法的(i,j)的对数。

输入输出样例
输入样例#1: 复制

5 6
2 4 3 4 2

输出样例#1: 复制

8
说明
对于30%的数据,$n \leq 500$。
对于60%的数据,$n \leq 100000$。
对于100%的数据,$1 \leq n,a_i \leq 500000$。

先枚举左端点,显然随着右端点右移,gcd不会增加,or不会减小

而且gcd每次减小最大为原来1/2,所以相同的gcd共可以分成logn块,实际上远远达不到

还有一个性质a^b^a=b

所以gcd^or^gcd=k^gcd=or

这样对于gcd相同的区间,用二分求出符合条件的or数量

用ST表维护x~y的gcd和or,而且了log要预处理,这样会快一些

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
int GCD[][],OR[][],Log[],n,k;
lol ans;
int gcd(int a,int b)
{
if (!b) return a;
return gcd(b,a%b);
}
int getg(int x,int y)
{
int d=Log[(y-x+)];
return gcd(GCD[x][d],GCD[y-(<<d)+][d]);
}
int getor(int x,int y)
{
int d=Log[(y-x+)];
return OR[x][d]|OR[y-(<<d)+][d];
}
int find(int x,int l,int g)
{
int r=n,as=l;
while (l<=r)
{
int mid=(l+r)/;
int G=getg(x,mid);
if (G==g) as=mid,l=mid+;
else r=mid-;
}
return as;
}
void query(int d,int x,int l,int r)
{
int L=l,R=r,as1=,as2=-;
while (l<=r)
{
int mid=(l+r)/;
int o=getor(x,mid);
if (o==d) as1=mid,r=mid-;
if (o<d) l=mid+;
if (o>d) r=mid-;
}
while (L<=R)
{
int mid=(L+R)/;
int o=getor(x,mid);
if (o==d) as2=mid,L=mid+;
if (o<d) L=mid+;
if (o>d) R=mid-;
}
ans+=as2-as1+;
}
int main()
{int i,x,pos,j;
cin>>n>>k;
for (i=;i<=n;i++)
{
scanf("%d",&x);
GCD[i][]=x;
OR[i][]=x;
}
for (i=;i<=n;i++)
Log[i]=Log[i/]+;
for (i=;i<=;i++)
{
for (j=;j<=n;j++)
if (j+(<<i)-<=n)
{
GCD[j][i]=gcd(GCD[j][i-],GCD[j+(<<i-)][i-]);
OR[j][i]=OR[j][i-]|OR[j+(<<i-)][i-];
}
}
for (i=;i<=n;i++)
{
for (j=i;j<=n;j=pos+)
{
int g=getg(i,j);
pos=find(i,j,g);
query(g^k,i,j,pos);
}
}
cout<<ans;
}

洛谷3794 签到题IV的更多相关文章

  1. A 洛谷 P3601 签到题 [欧拉函数 质因子分解]

    题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...

  2. 洛谷P3601签到题(欧拉函数)

    题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...

  3. 洛谷 P3601 签到题

    https://www.luogu.org/problemnew/show/P3601 一道关于欧拉函数的题. 读完题目以后我们知道所谓的$aindao(x)=x- \phi (x) $. 对于x小的 ...

  4. [Luogu 3794]签到题IV

    Description 题库链接 给定长度为 \(n\) 的序列 \(A\).求有多少子段 \([l,r]\) 满足 \[ \left(\gcd_{l\leq i\leq r}A_i\right) \ ...

  5. 洛谷P3601 签到题

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. 洛谷P3764 签到题 III

    题目背景 pj组选手zzq近日学会了求最大公约数的辗转相除法. 题目描述 类比辗转相除法,zzq定义了一个奇怪的函数: typedef long long ll; ll f(ll a,ll b) { ...

  7. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  8. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

  9. 洛谷P5274 优化题(ccj)

    洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...

随机推荐

  1. rtmp发布录制视频

    本文描述了rtmp发布本地视频的流程 一.简要介绍 RTMP协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection):第二步,建立一个网络流(NetStream) ...

  2. Java作业-网络编程

    Java网络编程 关于结合以前的大作业(即我的图书馆管理系统) 我感觉,图书馆管理系统更像是一个偏向于B/S模式的体系,如果想让他可用性变得更好,可以优化的地方只有使用数据库来代替文件,我个人是没有想 ...

  3. verilog学习笔记(2)_一个小module及其tb

    module-ex_cnt module ex_cnt( input wire sclk, input wire rst_n, output wire[9:0] cnt ); reg [9:0] cn ...

  4. equalsignorecase 和equals的区别

    equals方法来自于Object类equalsIgnoreCase方法来自String类equals对象参数是Object 用于比较两个对象是否相等equals在Object类中方法默然比较对象内存 ...

  5. Flask 学习 十 博客文章

    提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...

  6. js 选择图片生成base64数据

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. Struts2之配置

    Struts2的默认配置文件是struts.xml放在/web-inf/classes目录下,struts配置文件的最大作用就是配置Action与请求之间的对应关系,并配置逻辑视图名和物理视图名之间的 ...

  8. python之路--day11---迭代器和生成器

    迭代: 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 为什么要有迭代器: 数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法 ...

  9. ELK学习总结(2-5)elk的版本控制

    ----------------------------------------------------------------- 1.悲观锁和乐观锁 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据 ...

  10. docker实践3

    我的docker学习笔记3   $docker run ubuntu echo'hello world' $docker run -i -t ubuntu /bin/bash #ps -ef #exi ...