2018 CCPC 女生赛 hdoj6287 口算训练
题目地址: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\n"); else printf("Yes\n"); } } return 0; }