给出一个长度为\(n\)的正整数序列\(a\),\(m\)次询问\(l,r,x\),问\(max\{i|i\in[l,r],gcd(a_i,x)=1\}\)。

\(n,m,a_i\le 10^5\)。

分析

这个题很妙啊。

二分答案,问题变成判断在一个区间\([l,r]\)中是否存在\(gcd(a_i,x)=1\),变成判断\([l,r]\)中有多少个\(gcd(a_i,x)\ne 1\),我们要计算的就是:

\[\begin{aligned}
ret&=\sum _{i=L}^R[gcd(a_i,x)\ne 1] \\
&=\left[\sum _{i=L}^R\sum _{d|x,d|a_i}\mu (d)\right]=0 \\
\end{aligned}
\]

这个怎么算呢?我们注意到,如果\(d\)含有平方因子,那么\(\mu (d)\)必定是0,不需要去计算,所以我们只需要统计无平方因子数。可以发现,对于\(10^5\)以内的数,它的无平方因子非常少,最多为64个(\(2*3*5*7*11*13*17>10^5\)),所以直接枚举就好了。对于\([1,10^5]\)内的所有无平方因子数,我们记录含有它的每个\(a_i\)的下标\(i\),每次对于询问的\(x\)在区间内二分计算即可。

复杂度约为\(O(64nlog^2n)\)。

代码

#include<cstdio>
#include<cctype>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long giant;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e5+1;
int a[maxn],pm[maxn],ps=0,mu[maxn],from[maxn];
int sf[maxn],id[maxn],fs=0;
bool np[maxn];
vector<int> vec[maxn],my[maxn];
int many(int l,int r,int d) {
++r;
int fx=lower_bound(vec[d].begin(),vec[d].end(),l)-vec[d].begin();
int fy=lower_bound(vec[d].begin(),vec[d].end(),r)-vec[d].begin();
return fy-fx;
}
bool ok(int l,int r,int x) {
int ret=0;
for (int d:my[x]) {
int gs=many(l,r,d);
ret+=mu[d]*gs;
}
return ret;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("my.out","w",stdout);
#endif
int n=read(),q=read();
mu[1]=1;
for (int i=2;i<maxn;++i) {
if (!np[i]) pm[++ps]=i,mu[i]=-1,from[i]=1;
for (int j=1;j<=ps && (giant)pm[j]*i<maxn;++j) {
int tmp=pm[j]*i;
from[tmp]=i;
np[tmp]=true;
if (i%pm[j]==0) {
mu[tmp]=0;
break;
}
mu[tmp]=-mu[i];
}
}
for (int i=1;i<maxn;++i) if (mu[i]) sf[++fs]=i,id[i]=fs;
for (int i=1;i<maxn;++i) {
for (int j=1;(giant)j*j<=i;++j) if (i%j==0) {
if (mu[j]) my[i].push_back(j);
if ((giant)j*j!=i && mu[i/j]) my[i].push_back(i/j);
}
}
for (int i=1;i<=n;++i) {
int x=a[i]=read();
for (int d:my[x]) vec[d].push_back(i);
}
while (q--) {
int l=read(),r=read(),x=read(),mid,ans=-1;
while (l<=r) {
int mid=l+r>>1;
if (ok(mid,r,x)) l=mid+1,ans=mid; else r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}

ICPCCamp 2017 I Coprime Queries的更多相关文章

  1. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

  2. 2017年学习的三个CSS新特性

    这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...

  3. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  4. 消息:SQL Server 2017(vNext)的第三个公开的CTP(社区技术预览版)发布了

    今天看到了一个新闻,跟大家分享一下,有兴趣的可以去尝试一下. SQL Server 2017 CTP3于5月23日发布了,详细版本号是6.7.55.0. 大家可以去安装试试.在下载页面,目前是SQL  ...

  5. cs231n spring 2017 lecture13 Generative Models 听课笔记

    1. 非监督学习 监督学习有数据有标签,目的是学习数据和标签之间的映射关系.而无监督学习只有数据,没有标签,目的是学习数据额隐藏结构. 2. 生成模型(Generative Models) 已知训练数 ...

  6. [Codeforces 863D]Yet Another Array Queries Problem

    Description You are given an array a of size n, and q queries to it. There are queries of two types: ...

  7. 论文笔记:Dynamic Multimodal Instance Segmentation Guided by Natural Language Queries

    Dynamic Multimodal Instance Segmentation Guided by Natural Language Queries 2018-09-18 09:58:50 Pape ...

  8. ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)

    IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...

  9. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

随机推荐

  1. 20155321 2016-2017-2《Java程序设计》课堂实践项目

    20155321 2016-2017-2<Java程序设计>课堂实践项目 关于String类 split方法 charAt方法 项目题目: 模拟实现Linux下Sort -t : -k 2 ...

  2. 20155323 2016-2017-2《Java程序设计》课程总结

    20155323 2016-2017-2<Java程序设计>课程总结 课程与实验链接 预备作业一:新学期,新展望 预备作业二:游戏经验 预备作业三:安装虚拟机和Linux系统的学习 201 ...

  3. 20155323 第四次实验 Android程序设计实验报告

    20155323 第四次实验 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: ...

  4. 20155325 实验三 敏捷开发与XP实践

    实验三 敏捷开发与XP实践-1 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 在IDEA中使用工具(Code-> ...

  5. Kettle数据源连接配置

    说明: 通过(图3.1)我们可以看到创建数据源时需要配置相应的参数: Connection Name(必填):配置数据源使用名称,如:Rot_Source Host Name(必填):数据库主机IP地 ...

  6. HTML基本代码教学片,认识HTML

    今儿头午有点晕晕的感觉,咳咳,甩甩头开课 HTML 定义:超文本标记语言 (记不住的可以这么记:how to make love ! 哈哈,准备开车,粗人一个,长的不行) 其实理解起来很简单,超越文本 ...

  7. 使用SCSS扩展Bootstrap4

    摘要 因为打算写一个小网站,而个人时间又不是那么充裕,所以没有选择前后端分离的架构. 对于非前后端分离应用来说,Bootstrap应该是目前的最佳前端框架之一了. 而Bootstrap4,是Boots ...

  8. 三、利用EnterpriseFrameWork快速开发Winform系统(C/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 上一章讲解了开发Web系统的详细步骤,以书籍的管理作实例实现对书籍的增.删.改.查功能,本章接着上面的实例继续补充用Winform ...

  9. ubuntn 安装软件

    安装输入法 一.Ctrl+Alt+T打开终端,输入sudo apt-get install fcitx,安装fcitx插件. 二.打开input method,选择fcitx. 三.打开system ...

  10. Lua学习笔记(7): 模块

    模块 模块就像是c语言工程项目目录里的.h.c文件或外部依赖项,为某一个文件的代码提供依赖,其实就是把工作分成几个模块,方便项目的管理,提高开发效率和维护效率 在Lua中,模块其实就是一个表,实现方式 ...