题意
小 Ω 在小学数学课上学到了“幂次”的概念: $\forall a, b \in \N^+$ ,定义 $a^b$ 为 $b$ 个 $a$ 相乘。
她很好奇有多少正整数可以被表示为上述 $a^b$ 的形式?由于所有正整数 $m \in N^+$ 总是可以被表示为 $m^1$ 的形式,因此她要求上述的表示中,必须有 $b \geq k$ ,其中 $k$ 是她事先选取好的一个正整数。
因此她想知道在 $1$ 到 $n$ 中,有多少正整数 $x$ 可以被表示为 $x = a^b$ 的形式,其中 $a, b$ 都是正整数,且 $b \geq k$ ?
题解
一种容斥方法, $f_i$ 表示指数为 $i$ 的方案数,易得 $f_i=\sqrt[i]{n}-\sum_{k=2}f_{ki}$ 。
代码
注意精度
const int N = 100;
const long double eps = 1e-10;
inline ll Read() {
ll x = 0, f = 1;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -f, c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
return x * f;
}
namespace Main {
ll n, f[N], ans; int k;
int main () {
n = Read(), k = Read();
if (k == 1) {
printf ("%lld\n", n);
return 0;
}
for (int b = 61; b >= k; b--) {
f[b] = pow<long double> (n, 1.0 / b) + eps - 1;
for (int i = b * 2; i <= 61; i += b) f[b] -= f[i];
ans += f[b];
}
printf ("%lld\n", 1 + ans);
return 0;
}
}
int main () {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
Main::main();
return 0;
}