Codeforces 955C Sad powers (数论)
Posted doggod
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 955C Sad powers (数论)相关的知识,希望对你有一定的参考价值。
题目链接:Sad powers
题意:给出n个l和r,求出每个给出的[l,r]之间的可以使是另外一个数的k次方的数。(k>=2)
题解:题目给出的数据范围最大是1E18所以如果要直接把所有的从1-1E18的满足条件的数存下来的话一定会超时,但是我们可以注意到1e6^3 = 1e18,所以我们可以先把指数大于3的满足条件的数存下来,指数为2的分开来算(这里要把是别的数平方的数去掉,为了在后面算指数为2的数的时候更方便)。在算指数为2的数的时候要注意不可以用floor(sqrt(x))这种方法来取整,floor之后的数是double精度不够,对于大整数取整时一定要用自己的二分函数去求!
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX_N = 1e5+9; 4 const long long INF = 1e18+9; 5 typedef long long ll; 6 int N,M,T,S; 7 vector<long long> vec; 8 void init() 9 { 10 vec.clear(); 11 for(long long t = 2;t<=1e6;t++){ 12 int x = floor(sqrt(t)); 13 if(x*x == t) continue; 14 long long tt = t*t*t; 15 while(tt <= INF){ 16 vec.push_back(tt); 17 if(INF/tt >= t*t) tt *= t*t; 18 else break; 19 } 20 } 21 sort(vec.begin(),vec.end()); 22 vec.erase(unique(vec.begin(), vec.end()), vec.end()); 23 } 24 long long my_sq(long long x){ 25 long long l =1 , r = 1e9; 26 while(l<=r){ 27 long long mid = (l+r) / 2; 28 if(mid * mid <= x) l = mid +1 ; 29 else r = mid - 1; 30 } 31 return l; 32 } 33 int main() 34 { 35 init(); 36 while(cin>>N) 37 { 38 long long l , r; 39 for(int i=0;i<N;i++){ 40 scanf("%lld%lld",&l,&r); 41 int pos1 = lower_bound(vec.begin(),vec.end(),l) - vec.begin(); 42 int pos2 = upper_bound(vec.begin(),vec.end(),r) - vec.begin(); 43 long long ans1 = pos2 - pos1 ; 44 long long ans2 = my_sq(r) - my_sq(l-1); 45 cout<<ans1+ans2<<endl; 46 } 47 } 48 return 0; 49 }
以上是关于Codeforces 955C Sad powers (数论)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 955C Sad powers(数论)
Codeforces 955C Sad powers (数论)
Codeforces Round #426 (Div. 2) C. The Meaningless Game (二分 or pow函数)