Sigma Function(数论,思维)
题意描述
给定一个整数 \(N\) ,要求求出 \(x\in[1, N]\) 中 \(\sigma(x)\) 为偶数的 \(x\) 的个数(\(\sigma(x)\) 表示 \(x\) 的正约数和)。
原题链接
分析
将 \(x\) 素因子分解之后得到
\[x=\prod_{i=1}^{k}p_i^{\alpha_i}
\]
则 \(\sigma(x)\) 的计算公式:
\[\sigma(x)=(p_1^0+p_1^1+\dots+p_1^{\alpha_1})\times(p_2^0+p_2^1+\dots+p_2^{\alpha_2})\times\dots\times(p_k^0+p_k^1+\dots+p_k^{\alpha_k})
\]
我们不方便研究 \(\sigma(x)\) 为偶数的情况,我们可以研究 \(\sigma(x)\) 为奇数的情况,再用总数减掉奇数的个数即可。
我们要让 \(\sigma(x)\) 为奇数,则 \(\sigma(x)\) 的每一个因子都要为奇数,所以可以分开考虑公式的每一项:
- 若 \(2\mid x\),则 \((1+2^1+2^2+\dots+2^{\alpha})\) 这一项一定为奇数,因为 \(2\) 的任何次幂都是偶数,加上 \(1\) 就变成了奇数。
- 对于除了 \(2\) 以外的其他素因子,我们想要让 \((1+p^1+p^2+\dots+p^{\alpha})\) 为奇数,即想让 \(p^1+p^2+\dots+p^{\alpha}\) 为偶数,由于素因子的任何幂次都为奇数,所以只有当项数为偶数时,才能满足其为偶数,故可以得出其素因子的次数 \(\alpha_i\) 都为偶数
综上所述,满足 \(\sigma(x)\) 为奇数的数一定满足这样的形式:
\[x=2^t\times\prod_{i=1}^{k}p_i^{\alpha_i}(p_i为素因子,且\alpha_i为偶数)
\]
当次数都为偶数时,这个数其实就是一个完全平方数,所以可以简写成:
\[x=2^t\times m^k
\]
那么如何统计在 \([1, N]\) 中这样的数的个数呢?
- 当 \(t\) 为偶数时,把 \(2\) 这个质因子囊括进来,\(x\) 就是一个完全平方数,这一部分就直接统计 \([1, N]\) 当中的完全平方数就可以。
- 当 \(t\) 为奇数时,\(\frac{x}{2}\) 就为完全平方数,所以再统计 \([1, N]\) 中满足形式为 \(2\times a\times a\) 的形式的数即可。
Code:
// 原题链接:https://vjudge.net/problem/LightOJ-1336
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int T; cin >> T;
for (int C = 1; C <= T; C ++ ) {
LL n, res = 0; cin >> n;
for (int i = 1; i <= n / i; i ++ ) {
res ++ ;
if ((LL)i * i * 2 <= n) res ++ ;
}
cout << "Case " << C << ": " << n - res << '\n';
}
return 0;
}

浙公网安备 33010602011771号