题意:中文题目
思路:
1)运用:
1.vector (动态数组)
2.upper_bound (返回小于等于key的最后一个元素的后一个元素)
3.lower_bound (返回大于等于key的第一元素)
4.任何大于1的自然数,都可以唯一分解成有限个质数的乘积(唯一分解定理)
2)步骤:
1.将所给数组进行质因数分解,并且把数组标存入G[i]中。
//id原数组的下标,x原数组的值。eg:a[4]={2,3,4,5} prim(0,2)
void prim(int id,int x){
for(int i=2 ; i*i<=x ;i++){
while(x%i==0){
G[i].push_back(id);
x/=i;
}
}
if(x>1){
G[x].push_back(id);
}
}
2.将查询的P也进行质因数分解,然后将每个质因数的个数与原数组区间对应质因数的个数比较
/*eg:
a b
30 6
2,3,5 2,3
36 6
2,2,3,3 2,3
只要b全部的质因数都出现在a中,且相应质因数小于等于a中的,
a就是b的倍数
*/
3.注意,在处理质因数时(p函数),可能6/2=3,接着3没被处理。
//质因数分解+二分答案
#include
using namespace std;
const int maxn = 1e5+10;
vector G[maxn];
//id原数组的下标,x原数组的值。eg:a[4]={2,3,4,5} prim(0,2)
void prim(int id,int x){
for(int i=2 ; i*i<=x ;i++){
while(x%i==0){
G[i].push_back(id);
x/=i;
}
}
if(x>1){
G[x].push_back(id);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i1){
int pos = upper_bound(G[p].begin(),G[p].end(),r)-lower_bound(G[p].begin(),G[p].end(),l);
if(!pos){
flag=1;
}
}
if(flag) puts("No");
else puts("Yes");
}
}
}