视频加载失败

安吉D4-B

784 字
4 分钟
安吉D4-B
原题呈现

题目描述#

小 Ω 在小学数学课上学到了“幂次”的概念:a,bN+\forall a, b \in \mathbb{N}^+,定义 aba^bbbaa 相乘.

她很好奇有多少正整数可以被表示为上述 aba^b 的形式?由于所有正整数 mN+m \in \mathbb{N}^+ 总是可以被表示为 m1m^1 的形式,因此她要求上述的表示中,必须有 bkb \geq k,其中 kk 是她事先选取好的一个正整数.

因此她想知道在 11nn 中,有多少正整数 xx 可以被表示为 x=abx = a^b 的形式,其中 a,ba, b 都是正整数,且 bkb \geq k

输入格式#

第一行包含两个正整数 n,kn, k,意义如上所述.

输出格式#

输出一行包含一个非负整数表示对应的答案.

输入输出样例 #1#

输入 #1#

99 1

输出 #1#

99

输入输出样例 #2#

输入 #2#

99 3

输出 #2#

7

输入输出样例 #3#

输入 #3#

99 2

输出 #3#

12

说明/提示#

【样例 2 解释】

以下是全部 77 组符合题意的正整数及对应的一种合法的表示方法.

1=13,8=23,16=24,27=33,32=25,64=43,81=341 = 1^3, 8 = 2^3, 16 = 2^4, 27 = 3^3, 32 = 2^5, 64 = 4^3, 81 = 3^4

注意某些正整数可能有多种合法的表示方法,例如 6464 还可以表示为 64=2664 = 2^6

但根据题意,同一个数的不同的合法表示方法只会被计入一次.

【样例 3 解释】

以下是全部 1212 组符合题意的正整数及对应的一种合法的表示方法.

1=12,4=22,8=23,9=32,16=42,25=52,27=33,32=25,36=62,49=72,64=82,81=92 1 = 1^2, 4 = 2^2, 8 = 2^3, 9 = 3^2, 16 = 4^2, 25 = 5^2, 27 = 3^3, 32 = 2^5, 36 = 6^2, 49 = 7^2, 64 = 8^2, 81 = 9^2

【数据范围】

对于所有数据,保证 1n10181 \leq n \leq 10^{18}1k1001 \leq k \leq 100

测试点编号nn \lekk
110210^2=1=1
2^2\ge2
310410^43\ge3
4^2\ge2
510610^63\ge3
6^2\ge2
710810^83\ge3
8^2\ge2
9101010^{10}3\ge3
10^2\ge2
11101210^{12}3\ge3
12^2\ge2
13101410^{14}3\ge3
14^2\ge2
15101610^{16}3\ge3
16^2\ge2
17101810^{18}3\ge3
18^2\ge2
19^^
20^^

不难得知,使用次方的逆运算 nk\lfloor\sqrt[k]{n}\rfloor 可以快速得知小于 nn 的完全 kk 次方数的数量.那么答案就是

i=klog21018ni\sum_{i=k}^{\log_{2}10^{18}} \lfloor\sqrt[i]{n}\rfloor

对于 8 来说,它既是完全平方数,也是完全立方数,在 i=1i=1i=2i=2i=3i=3 时都被算了一次,重复算了两次.为了去除这种重复,我们定义 f[i] 表示满足下列条件的正整数数量:

  1. 小于 nn
  2. 是完全 kk 次方数
  3. 不是完全 j×kj\times k 次方数,jN,j>1j\in\mathbb{N}, j>1

因此,f[i] 的数值就等于满足条件 1 和 2 的正整数数量(即 nk\lfloor\sqrt[k]{n}\rfloor)减去不满足条件 3 的正整数数量(log2101860\log_{2}10^{18}\approx 60):

f[i]=nk1j=k60f[i×j]f[i] = \lfloor\sqrt[k]{n}\rfloor - 1 - \sum_{j=k}^{60}f[i\times j]

上式中的 -1 是因为去除以 1 为底数的数,以 1 为底数,任意自然数为指数都为 1.所以每一次计算 nk\lfloor\sqrt[k]{n}\rfloor,1 都会被算 1 遍,在这里减去,最后统一加 1.

最终答案为:1+i=k60f[i]1 + \sum_{i=k}^{60} f[i]

标程

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k, f[62], ans;
int main() {
cin >> n >> k;
for (int i = 60; i >= k; i--) {
f[i] = powl(n, 1.0 / i) - 1;
for (int j = 2; j * i <= 60; j++) {
f[i] -= f[j * i];
}
}
for (int i = k; i <= 60; i++) {
ans += f[i];
}
cout << ans + 1;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

安吉D4-B
https://blog.jerrylab.top/posts/problem/anji2026/D4/B/
作者
Jerry
发布于
2026-08-04
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Jerry
Hello, I'm Jerry.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
80
分类
3
标签
35
总字数
89,198
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0