洛谷P2508
[HAOI2008] 圆上的整点
题目描述
求一个给定的圆 ( x 2 + y 2 = r 2 ) (x^2+y^2=r^2) (x2+y2=r2),在圆周上有多少个点的坐标是整数。
输入格式
输入半径 r r r
输出格式
整点个数
样例 #1
样例输入 #1
4
样例输出 #1
4
提示
r ≤ 2000000000 r\leq 2000 000 000 r≤2000000000
复数回顾
复数为形如
a
+
b
i
的数
(
a
,
b
∈
R
)
,
其中
i
是虚数单位
,
且
i
2
=
−
1
复数为形如a+bi的数(a, b \in R), 其中i是虚数单位, 且i^2=-1
复数为形如a+bi的数(a,b∈R),其中i是虚数单位,且i2=−1
它在直角坐标系中对应着点P(a, b), 如图:
令:
z
=
a
+
b
i
令:z = a + bi
令:z=a+bi
则:
z
ˉ
=
a
−
b
i
则: \bar{z} = a - bi
则:zˉ=a−bi
我们将
z
ˉ
和
z
互称为
我们将\bar{z}和z互称为
我们将zˉ和z互称为共轭复数
高斯整数:
一个复数的
a
,
b
均为整数,则称这个数是高斯整数
一个复数的a,b均为整数,则称这个数是高斯整数
一个复数的a,b均为整数,则称这个数是高斯整数
高斯素数:
一个高斯整数不可再拆成两个高斯整数之积,则称这个数是高斯素数
一个高斯整数不可再拆成两个高斯整数之积,则称这个数是高斯素数
一个高斯整数不可再拆成两个高斯整数之积,则称这个数是高斯素数
题目分析
若有一组满足题意的数对
(
x
0
,
y
0
)
,
则可以推出的性质
若有一组满足题意的数对(x_0,y_0), 则可以推出的性质
若有一组满足题意的数对(x0,y0),则可以推出的性质
z
=
x
0
+
y
0
i
时
,
z
⋅
z
ˉ
=
r
2
z = x_0+y_0i时, z\cdot\bar{z}=r^2
z=x0+y0i时,z⋅zˉ=r2
∴
问题转化成了存在多少个高斯整数,使得
z
⋅
z
ˉ
=
r
2
\therefore 问题转化成了存在多少个高斯整数,使得z\cdot\bar{z}=r^2
∴问题转化成了存在多少个高斯整数,使得z⋅zˉ=r2
接下来,我们先来计算整数的分解
接下来,我们先来计算整数的分解
接下来,我们先来计算整数的分解
整数的分解因式
若它的a为合数他显然可以分解成两个数的乘积
假设现在将
a
拆成了
p
1
α
1
⋅
p
2
α
2
…
p
n
α
n
(
p
1
,
p
2
,
…
,
p
n
)
假设现在将a拆成了{p_1}^{\alpha _1} \cdot {p_2}^{\alpha _2} \dots {p_n}^{\alpha _n} (p_1, p_2,\dots, p_n)
假设现在将a拆成了p1α1⋅p2α2…pnαn(p1,p2,…,pn)
若
p
i
m
o
d
4
=
1
,
由
若p_imod4=1, 由
若pimod4=1,由 费马平方数定理:
若质数
p
≡
1
(
m
o
d
4
)
那么
p
可以拆成唯一一组正整数平方和,否则不可拆
若质数p\equiv 1(mod 4) 那么p可以拆成唯一一组正整数平方和,否则不可拆
若质数p≡1(mod4)那么p可以拆成唯一一组正整数平方和,否则不可拆
∴
a
=
(
a
1
+
b
1
i
)
α
1
…
(
a
k
+
b
k
i
)
α
k
(
模
4
余
1
的质数是一对共轭,其他的都是自己一个
)
\therefore a = (a_1 + b_1i)^{\alpha _1} \dots (a_k + b_ki)^{\alpha _k}(模4余1的质数是一对共轭,其他的都是自己一个)
∴a=(a1+b1i)α1…(ak+bki)αk(模4余1的质数是一对共轭,其他的都是自己一个)
最终解答
假设我们已经将
r
2
拆分成了
(
a
1
+
b
1
i
)
2
α
1
…
(
a
k
+
b
k
i
)
2
α
k
假设我们已经将r^2拆分成了(a_1 + b_1i)^{2\alpha _1} \dots (a_k + b_ki)^{2\alpha _k}
假设我们已经将r2拆分成了(a1+b1i)2α1…(ak+bki)2αk
则:我们可以将
(
a
j
+
b
j
i
)
2
α
j
与它共轭的数先平均分在
z
与
z
ˉ
(
对模
4
余
1
)
则:我们可以将(a_j + b_ji)^{2\alpha _j}与它共轭的数先平均分在z与\bar{z}(对模4余1)
则:我们可以将(aj+bji)2αj与它共轭的数先平均分在z与zˉ(对模4余1)
再将每一项互相交换,那么
z
与
z
ˉ
还是共轭的
再将每一项互相交换,那么z与\bar{z}还是共轭的
再将每一项互相交换,那么z与zˉ还是共轭的
共有
2
α
j
+
1
中可能
共有2\alpha _j + 1中可能
共有2αj+1中可能
∴
(
x
,
y
)
共有
r
中模
4
余
1
的质因数此数的平方
+
1
的乘积再乘
4
(
乘
4
是因为它可以是四个象限中任意一个
)
\therefore (x, y) 共有r中模4余1的质因数此数的平方+1的乘积再乘4(乘4是因为它可以是四个象限中任意一个)
∴(x,y)共有r中模4余1的质因数此数的平方+1的乘积再乘4(乘4是因为它可以是四个象限中任意一个)
代码
#include <bits/stdc++.h>
using namespace std;
long long ans = 1; // 初始化乘积
int main()
{
long long r;
cin >> r;
for(long long i = 2; i * i <= r; i++) // 找质因数
{
if(n % i == 0) // 找到质因数
{
int cnt = 0;
while(n % i == 0)
{
n /= i;
cnt++;
}
if(i % 4 == 1) ans *= cnt * 2 + 1; // 是模4余1类的
}
}
if(n != 1 && n % 4 == 1) ans *= 3; // 如果r本身就是一个模4余1类的
cout << ans * 4; // 四个象限
return 0;
}