P2508 [HAOI2008] 圆上的整点

题目描述

求一个给定的圆 \((x^2+y^2=r^2)\),在圆周上有多少个点的坐标是整数。

\(r \le 2000 000 000\)


B3B1 讲的一个妙妙小视频 隐藏在素数规律中的π

根据 费马平方和定理,我们知道对奇素数 \(p = 4k + 1\)\(p\) 可被分解为两个正整数的平方和形式,即 \(p = a^2 + b^2\),我们引入高斯整数。

高斯整数:形如 \(a + bi\) 形式的复数,其中 \(a, \, b\) 均为整数。

高斯素数:不能被分解为除模长为 \(1\) 外多个高斯整数相乘的高斯整数。

根据费马平方和定理,我们容易得知 \(p\) 的高斯分解是唯一的,即 \(p = a^2 + b^2 = (a + bi)(a - bi)\),这样,我们将一个二元问题转化为了一个一元问题。

考虑到 \(a + bi\)\(a - bi\) 总是作为共轭出现,所以不同的 \(a, \, b\) 才是我们想要找到的不同解,实际上,通过 \(a + bi\)\(i, \, -1, \, -i\),与 \(a - bi\)\(-i, \, -1, \, i\),我们可以得到

高斯素数1 高斯素数2
\(a + bi\) \(a - bi\)
\(-b + ai\) \(-b - ai\)
\(-a - bi\) \(-a + bi\)
\(b - ai\) \(b + ai\)

其实就是旋转 \(\frac{\pi}{2}, \, \pi, \, \frac{3\pi}{2}\) 的产物,两两之间均不同(\(2\) 除外,后面我们再讨论 \(2\))。

如上,我们有了一个初步的思路,分解 \(p\),得到所有的高斯素数并任意组合得到两个共轭,然后乘 \(4\) 就是答案。

对于任意奇素数 \(p = 4k + 1\)\(p^k\) 可分解为 \((a + bi)^k(a - bi)^k\),选 \(0 \sim k\)\(a + bi\),剩余选 \(a - bi\),可以恰好分为两个共轭,因此 \(p^k\) 对我们的贡献是 \(k + 1\),如果有多个素数,根据唯一分解定理,同样可以通过分共轭的方式得到我们所有的情况。

但是,我们知道奇素数 \(p = 4k + 3\) 时,没有对应的高斯分解,此时,如果分解除的 \(p\) 的幂次是偶数,我们可以等量的分给两个共轭,这样他们的乘积仍然为共轭,否则不满足共轭条件。

同样,\(2\) 很特殊,他能被分为 \(1 + i\)\(1 - i\),这两个高斯素数之间的幅角为 \(\frac{\pi}{2}\),因此乘 \(i\) 后可以得到另一个共轭,这也告诉我们,对与 \(2\) 的分解来说,我们的贡献只有 \(1\),也就是说 \(2\) 的幂不改变答案。

最后我们考虑上述讨论,给出一个形式化的结论,设 \(n = p_1^{k_1}p_2^{k_2}\cdots p_t^{k_t}\)

\[\pi(n) = \prod_{p_i \bmod 4 = 1}(k_i + 1)\prod_{p_i \bmod 4 = 3}[k_i \bmod 4 = 0] \]

由于题目自身满足 \(n = r^2\),所以 \(2 \mid k_i\),因此答案为

\[\prod_{p_i \bmod 4 = 1}(2k_i + 1) \]

\(O(\sqrt{n})\) 的时间复杂度内唯一分解即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll ans = 4, x;
    cin >> x;
    for (int i = 2; i * i <= x; i ++ ) {
        int tot = 0;
        while (x % i == 0) x /= i, tot ++ ;
        if (i % 4 == 1) ans *= (2 * tot + 1);
    }
    if (x > 1 && x % 4 == 1) ans *= 3;
    cout << ans << "\n";
    return 0;
}
posted @ 2025-04-21 20:54  YipChip  阅读(26)  评论(0)    收藏  举报