码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 955C - Sad powers(数论 + 二分)

时间:2018-04-11 17:11:15      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:lan   ace   targe   lse   while   algo   整数   blank   const   

链接:

http://codeforces.com/problemset/problem/955/C

 

题意:

Q次询问(1≤Q≤1e5),每次询问给出两个整数L, R(1≤L≤R≤1e18),求所有符合条件的整数x的个数。
条件为:L≤x≤R,x = a的p次方(a, p为整数且a>0, p>1)。

 

分析:

一、当指数p=3时,底数a最多有1e6个,由于指数增加时底数收敛得很快,
所以我们可以将p>=3时的所有x放进vector里排序去重(预处理),求x的个数的时候二分查找即可。
二、对于p=2,也可以使用二分查找来得到x的个数。
这两种情况会有重复的x,所以要在预处理的时候把所有的平方数去掉。

 

代码:

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 typedef long long int LLI;
 7 const LLI UP = 1e18;
 8 vector<LLI> V;
 9 
10 LLI root(LLI n) { // 二分查找n的平方根r(n <= r*r)
11     LLI L = 1, R = 1e9 + 1;
12     while(L < R) {
13         LLI M = L + (R - L) / 2;
14         if(M * M >= n) R = M;
15         else L = M + 1;
16     }
17     return L;
18 }
19 
20 void constant() {
21     vector<LLI> V2 = {1};
22     int u = 1e6;
23     for(int n = 2; n <= u; n++) {
24         for(LLI i = 1LL * n * n * n; ; i *= n) {
25             V2.push_back(i);
26             if(i > UP / n) break; // 防止 long long 溢出
27         }
28     }
29     sort(V2.begin(), V2.end());
30     V2.erase(unique(V2.begin(), V2.end()), V2.end());
31     for(int i = 0; i < V2.size(); i++) {
32         LLI r = root(V2[i]);
33         if(r * r != V2[i]) V.push_back(V2[i]);
34     }
35 }
36 
37 int main() {
38     constant(); // 预处理
39     int q;
40     LLI L, R;
41     scanf("%d", &q);
42     while(q--) {
43         scanf("%I64d%I64d", &L, &R);
44         LLI ans = upper_bound(V.begin(), V.end(), R)
45                 - lower_bound(V.begin(), V.end(), L);
46         ans += root(R+1) - root(L);
47         printf("%I64d\n", ans);
48     }
49     return 0;
50 }

 

Codeforces 955C - Sad powers(数论 + 二分)

标签:lan   ace   targe   lse   while   algo   整数   blank   const   

原文地址:https://www.cnblogs.com/hkxy125/p/8796625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!