1 5 4 6 4 7 2 5 1 2 24 1 3 18 2 5 17 3 5 35Sample Output
Yes No No Yes
先用vector记录下每个因子出现的位置。vector里存的是含有i这个因子的下标。
查找l到r里因子个数时用upper_bound() - lower_bound()就可以。
#include
using namespace std;
vector a[100005];
int T, n, m;
void init(int x, int Index){
for(int i = 2; i * i <= x; i++){
if(x % i == 0){
while(x % i == 0){
x /= i;
a[i].push_back(Index);
}
}
}
if(x > 1)
a[x].push_back(Index);
}
int query(int l, int r, int x){
return upper_bound(a[x].begin(), a[x].end(), r) - lower_bound(a[x].begin(), a[x].end(), l);
}
int judge(int l, int r, int x){
for(int i = 2; i * i <= x; i++){
if(x % i == 0){
int t = 0;
while(x % i == 0){
x /= i;
t++;
}
int c = query(l, r, i);
if(t > c)
return 0;
}
}
if(x > 1 && query(l, r, x) < 1)
return 0;
return 1;
}
int main()
{
scanf("%d", &T);
while(T--){
for(int i = 0; i < 100005; i++)
a[i].clear();
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
int x;
scanf("%d", &x);
init(x, i);
}
for(int i = 0; i < m; i++){
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
int flag = judge(l, r, d);
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}