第一,求管理通过一下这个修了 LATEX 的翻译:
给你 $q$ 个询问,每次询问 $[l,r]$ 这个区间内满足 $x=a^p(a>0,p>1)$ 的 $x$ 的数量。
数据范围:
- $1\leqslant q\leqslant 10^5$。
- $1\leqslant l\leqslant r\leqslant 10^{18}$。
Translated by Eason_AC
2021.10.8
第二,求问以下代码为什么在 C++14 下可以通过而 C++17 不行?md 就这 sb 玩意浪费我今天大半个下午
#include <bits/stdc++.h>
#define F(T, i, a, b) for(T (i) = (a); (i) <= (b); ++(i))
#define R(T, i, a, b) for(T (i) = (a); (i) >= (b); --(i))
#define Fo(T, i, a, b, c) for(T (i) = (a); (i) <= (b); (i) += (c))
#define Re(T, i, a, b, c) for(T (i) = (a); (i) >= (b); (i) -= (c))
#define For(T, i, a, b, c) for(T (i) = (a); (i) <= (b); (i) *= (c))
#define Rep(T, i, a, b, c) for(T (i) = (a); (i) >= (b); (i) /= (c))
#define Tl template<typename T>
#define Tla template<typename T, typename... Args>
#define ui unsigned int
#define ll long long
#define ull unsigned long long
#define ld long double
#define ib inline bool
#define ii inline int
#define iui inline ui
#define ill inline ll
#define iull inline ull
#define iv inline void
using namespace std;
namespace fastIO {
Tl iv read(T & x) {T f = 1; x = 0; char c = getchar(); while(!isdigit(c)) {if(c == '-') f = -1; c = getchar();} while(isdigit(c)) {x = x * 10 + c - '0'; c = getchar();} x *= f;}
Tla iv read(T& x, Args& ...args) {read(x), read(args...);}
Tl iv write(T x) {if(x < 0) putchar('-'), x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0');}
Tl iv print(T x, char ch) {write(x), putchar(ch);}
iv file(string s) {freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout);}
}
using namespace fastIO;
namespace Solution {
const int N = 3e6 + 7;
const ll MX = 1e18;
int q, cnt;
ll l, r, num[N];
ill solve(ll x) {
ll idx = lower_bound(num + 1, num + cnt + 1, x) - num;
if((idx <= cnt && num[idx] > x) || idx > cnt) idx--;
return idx + (ll)sqrt(x);
}
iv Main() {
F(ll, i, 2, 1000000) {
long long k = i * i;
for(; k <= MX / i; ) {
k *= i;
ll sqrtk = sqrt(k);
if(sqrtk * sqrtk != k) num[++cnt] = k;
}
}
sort(num + 1, num + cnt + 1), cnt = unique(num + 1, num + cnt + 1) - num - 1;
read(q); while(q--) read(l, r), print(solve(r) - solve(l - 1), '\n');
return;
}
}
int main() {
Solution :: Main();
return 0;
}