0%

2025-2026 ICPC NERC, Kyrgyzstan Regional Contest 吉尔吉斯斯坦——C. You can't just take and divide(约数个数定理,因数个数定理)

题目大意

题目名称:C. You can’t just take and divide(你不能只是拿来分析)

题目描述
Anatoly 和 Antitoly 对资源的分配有不同的看法。Antitoly 正在开发一个由参数 nn 定义的理想社会模型。你需要帮他计算在区间 [1,n][1, n] 中,有多少个整数 xx 同时满足以下两个条件:

  1. xx奇数

  2. xx因子个数奇素数

输入格式
第一行包含一个奇整数 nn (3n111133 \le n \le 111^{13})。注意数据范围非常大,需使用能够处理大数的类型或高精度。

输出格式
输出一个整数 RR,表示满足条件的 xx 的个数。

样例 1

1
2
3
4
5
输入:
3

输出:
0

样例 1 解释

  • 1 的因子个数为 1(奇数但不是素数)。

  • 2 是偶数。

  • 3 的因子个数为 2(素数但不是奇数)。
    没有满足条件的数。

样例 2

1
2
3
4
5
输入:
5

输出:
0

样例 2 解释

  • 接续样例 1,新增 4 和 5。

  • 4 的因子个数为 3(奇素数),但 4 本身是偶数。

  • 5 的因子个数为 2(偶素数)。
    没有满足条件的数。

样例 3

1
2
3
4
5
输入:
9

输出:
1

样例 3 解释

  • 接续样例 2,新增 6, 7, 8, 9。

  • 6, 8 是偶数。

  • 7 的因子个数为 2。

  • 9 是奇数,且因子为 1, 3, 9,共 3 个。3 是奇素数,满足所有条件。
    故答案为 1。

样例 4

1
2
3
4
5
输入:
111

输出:
4

样例 5

1
2
3
4
5
输入:
9753113579

输出:
9563

思路讲解

ABC-383-D - 9 Divisors 

使用因数个数定理,或者说是约数个数定理。

image

其实使用约束个数定理不难得出如下的结论,那么 P 的 e1 次方就是我们所要枚举得出的这个数。

pe1; e1+1,p{3,5,7,11,}(除了2的所有素因数)p^{e1};\ e1+1,p\in\{3,5,7,11,\cdots\}(除了 2 的所有素因数)

由于 e1 是从这个 2 开始的,所以我们直接遍历的时间复杂度是 O(n)O(\sqrt n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Solve() {
ll N;
cin >> N;
sieve(1e7);
ll ans=0;
// 我们这里实际上是在遍历的是 e1 加一。
for (auto e1:primes) {
if (e1==2) continue;
for (auto p:primes) {
if (p==2) continue;
__int128 num=1;
// 因为我们上面便利的是 e1+1,所以说这边就乘 e1-1 次。
for (int i=1;i<=e1-1;++i) {
num*=p;
}
if (num>N) {
if (p==3) {
cout<<ans<<"\n";
return;
}
break;
}else {
++ans;
}
}
}
}

AC代码

心路历程(WA,TLE,MLE……)