暴力解法
最直观的想法是严格按照题目描述进行模拟。对于每次查询 (p,k),我们从下标 p 开始遍历数组,逐个检查每个元素 ai 是否与 ap 的最大公约数不为 1。我们用一个计数器来记录满足条件的元素个数,当计数器达到 k 时,就找到了答案。
优化思路:问题转化
给定由 n 个整数构成的数组 {a1,a2,...,an} ,下标从 1 到 n 。现在有 q 次查询,每次查询给出两个整数 p,k 。
对于每个查询,定义如下过程:
从数组下标 p 开始(包含该位置),依次向右扫描每个位置 i(p≤i≤n);
统计满足 gcd(ap,ai)=1 的元素,当计数达到 k 时,输出该位置的下标;
如果扫描结束仍未找到第 k 个此类元素,则输出 −1 。
最大公约数(gcd) 定义:多个整数共有约数中最大的一个,例如 gcd(12,30)=6 。
第一行输入两个整数 n,q(2≤n,q≤6×104) ,分别表示数组长度和查询次数。
第二行输入 n 个整数 a1,a2,...,an(2≤ai≤6×104) ;
接下来 q 行,每行输入两个整数 p,k(1≤p≤n;1≤k≤n) 。
对每次查询,新起一行输出一个整数,表示答案下标,若不存在,则输出 −1 .
输入
6 3
2 3 4 6 5 9
1 2
2 1
3 3
输出
3
2
-1
说明
查询 (1,2) :起始元素 a1=2,扫描位置依次为 1(gcd(2,2)=2=1,计数 1 )、2(gcd(2,3)=1,跳过)、3(gcd(2,4)=2=1,计数 2 ),第 2 个不互质元素下标 3 ;
查询 (2,1) :起始元素 a2=3,扫描位置2(gcd(3,3)=3=1 ),第 1 个不互质元素下标 2 ;
查询 (3,3) :起始元素 a3=4,扫描位置依次为 3、4 ,仅计数到 2 ,不存在第 3 个,输出 −1 。