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;
}
posted @ 2021-10-29 08:08  Xeus  阅读(290)  评论(0)    收藏  举报