题目连接: 点击打开链接
小Q非常喜欢数学,但是他的口算能力非常弱。因此他找到了小T,给了小T一个长度为
n的正整数序列
a1,a2,...,an,要求小T抛出
m个问题以训练他的口算能力。
每个问题给出三个正整数
l,r,d,小Q需要通过口算快速判断
al×al+1×...×ar−1×ar是不是
d的倍数。
小Q迅速地回答了出来,但是小T并不知道正确答案是什么,请写一个程序帮助小T计算这些问题的正确答案。
Input
第一行包含一个正整数
T(1≤T≤10),表示测试数据的组数。
每组数据第一行包含两个正整数
n,m(1≤n,m≤100000),分别表示序列长度以及问题个数。
第二行包含
n个正整数
a1,a2,...,an(1≤ai≤100000),表示序列中的每个数。
接下来
m行,每行三个正整数
l,r,d(1≤l≤r≤n,1≤d≤100000),表示每个问题。
Output
对于每个问题输出一行,若是倍数,输出Yes,否则输出No。
咋一眼看好像不难,再稍微一想感觉很难,最后仔细一想感觉不是很难。。。。。
就是一个问题,一个数n的质因子大于sqrt(n)的最多只有一个,在看数据范围,小于sqrt(n)的素数只有100个不到。
那么我们就预处理每一个数的质因数,做一个前缀和,在区间内的质因子数是否大于询问数中的质因子数(感觉有点拗口,看代码就很清楚了)。最后对大于sqrt(n)的做一下特殊处理。判断这个区间内的数有没有一个数的质因子( 大于sqrt(n))等于询问中的质因子,感觉比较有技巧性。先上代码后面来解释这个技巧。
#include
#include
#include
#include
#include
#include
#include
现在来说这么判断的。在一个单调的数组中判断是否有 l-r的其中一个数。
来自大佬的博客
https://blog.csdn.net/Game_Acm/article/details/80480968
二分找到 大于等于l 的下标 cc
二分找到大于 r 的下标dd
如果cc==dd那么就不存在。
至于为什么可以这样做。。手动模拟一下和容易发现。