题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6287
Summarize:
1、分解质因数;
2、二分查找函数lower_bound与upper_bound;
3、注意输入输出超时与初始化;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5+5;
int T, n, m;
vector<int> prime[N];
int query(int x, int l, int r)
{
return upper_bound(prime[x].begin(), prime[x].end(), r) - lower_bound(prime[x].begin(), prime[x].end(), l);
}
bool half_find(int l ,int r, int k)
{
for(int i=2; i*i<=k; i++) {
int cnt=0;
while(!(k%i)) {
k /= i;
cnt++;
}
if(cnt > query(i, l, r)) return false;
}
if(k>1 && query(k, l, r)<1) return false;
return true;
}
int main()
{
scanf("%d", &T);
while(T--)
{
for(int i=1; i<N; i++)
prime[i].clear();
scanf("%d%d", &n ,&m);
for(int i=1, x; i<=n; i++) {
scanf("%d", &x);
for(int j=2; j*j<=x; j++) {
while(!(x%j)) {
x /= j;
prime[j].push_back(i);
}
}
if(x>1) prime[x].push_back(i);
}
for(int i=0,l,r,d; i<m; i++) {
scanf("%d%d%d", &l, &r, &d);
if(!half_find(l, r, d))
printf("No
");
else printf("Yes
");
}
}
return 0;
}