题意

小 Ω 在小学数学课上学到了“幂次”的概念: $\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;
}
EOF

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

博客信息

作者
Jayun
时间
2023-11-05 20:19:08
博客类型
标签