• Source
    1. #include<bits/stdc++.h>
    2. #define MAX 1000009
    3. #define lim 1000000000000
    4.  
    5. using namespace std;
    6.  
    7. bool arr[MAX];
    8.  
    9. vector<int>prime;
    10.  
    11. vector<long long>check;
    12.  
    13. void sieve()
    14. {
    15. long long i,j,k;
    16.  
    17. k= sqrt(MAX);
    18.  
    19. prime.push_back(2);
    20.  
    21. for(i=3; i<=k; i+=2)
    22. {
    23. if(arr[i]==0)
    24. {
    25. for(j=i*i; j<MAX; j+=i+i)
    26. {
    27. arr[j]=1;
    28. }
    29. }
    30. }
    31.  
    32. for(i=3; i<MAX; i+=2)
    33. if(arr[i]==0)
    34. prime.push_back(i);
    35. }
    36.  
    37. int main()
    38. {
    39. sieve();
    40.  
    41. int sz = prime.size(),test,i,j;
    42.  
    43. for(i=0; i<sz; i++)
    44. {
    45. for(j=2;; j++)
    46. {
    47. long long store = pow(prime[i],j);
    48.  
    49. if(store<=lim)
    50. {
    51. check.push_back(store);
    52. }
    53. else
    54. break;
    55. }
    56. }
    57.  
    58. sort(check.begin(),check.end());
    59.  
    60. long long low,high,res;
    61.  
    62. scanf("%d",&test);
    63.  
    64. while(test--)
    65. {
    66. scanf("%lld%lld",&low,&high);
    67.  
    68. vector<long long>::iterator from,to;
    69.  
    70. from = lower_bound(check.begin(),check.end(),low);
    71.  
    72. to = upper_bound(check.begin(),check.end(),high);
    73.  
    74. res = (to-check.begin())-(from-check.begin());
    75.  
    76. printf("%lld\n",res);
    77. }
    78.  
    79. return 0;
    80. }