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}\)
由于题目自身满足 \(n = r^2\),所以 \(2 \mid k_i\),因此答案为
在 \(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;
}

浙公网安备 33010602011771号