CF955C
zhongpeilin · · 个人记录
题目大意:
3.算
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define int long long
const int INF = 1e18;
bool vis[105];
int mu[105], f[105];
vector<int> prime, pw[66];
int qp(int a, int b){
int ans = 1;
while(b){
if(b % 2){
if(INF / ans < a) return INF + 1;
ans *= a;
}
b /= 2;
if(b == 0) return 0;
if(INF / a < a) return INF + 1;
a = a * a;
}
return 0;
}
int sum(int x){
if(x <= 1ll) return x;
f[2] = sqrtl(x);
for(int i = 3; i < 60; i++){//算f
int p = upper_bound(pw[i].begin(), pw[i].end(), x) - pw[i].begin();
f[i] = p - 2;
}
int ans = 1;
for(int i = 2; i <= 60; i++){ //算g
for(int j = i; j <= 60; j += i){
ans += mu[j / i] * f[j];
}
}
return ans;
}
inline int read(){
int x = 0;
char op = getchar();
while(op < '0' || op > '9') op = getchar();
while(op >= '0' && op <= '9'){
x = x * 10 + (op - '0');
op = getchar();
}
return x;
}
signed main(){
for(int i = 3; i <= 60; i++){ //预处理出幂次
int l = 2, r = 1000000000, ans = 0;
while(l <= r){
int mid = (l + r) / 2;
if(qp(mid, i) <= INF){
l = mid + 1, ans = mid;
} else {
r = mid - 1;
}
}
for(int j = 1; j <= ans; j++) {
pw[i].push_back(pow(j, i));
}
}
mu[1] = 1;
for(int i = 2; i <= 100; i++){//算莫比乌斯函数
if(!vis[i]){
prime.push_back(i);
mu[i] = -1;
}
for(int j = 0; j < prime.size(); j++){
if(i * prime[j] > 100) break;
if(i % prime[j] == 0){
mu[i * prime[j]] = 0;
vis[i * prime[j]] = 1;
break;
} else {
vis[i * prime[j]] = 1;
mu[i * prime[j]] = mu[i] * (-1);
}
}
}
int q, l, r;
q = read();
while(q--){
l = read(), r = read();
printf("%lld\n", sum(r) - sum(l - 1));
}
return 0;
}