壹
HAOI2008
圆上的整点
一
题目描述
求一个给定的圆(x2+y2=r^2),在圆周上有多少个点的坐标是整数。
关于这题的大概思路
考虑平方数
a
2
a^2
a2 mod 4 不是0就是1,平方数
b
2
b^2
b2同理;
因此假设某素数
p
=
(
a
−
b
i
)
∗
(
a
+
b
i
)
=
a
2
+
b
2
p=(a-bi)*(a+bi)=a^2+b^2
p=(a−bi)∗(a+bi)=a2+b2
则
p
p
p mod 4 同余 0,1,2;
所以不能被复数分解的素数的形式一定为
4
∗
n
+
3
4*n+3
4∗n+3
代码略。
贰
求圆内整点
题目描述
有多少个数对
(
a
,
b
,
c
)
(a,b,c)
(a,b,c),满足
0
<
a
<
b
<
c
<
=
n
0<a<b<c<=n
0<a<b<c<=n,
a
2
+
b
2
=
c
2
a^2+b^2=c^2
a2+b2=c2.
遍历一遍复平面上的四分之一圆即可。
#include <cstdio>
using namespace std;
const int N = 1000010;
int f[N], num[N], p[N], n, ans, t;
bool v[N];
int main()
{
scanf("%d", &n);
for(int i = 2; i <= n; i++)
{
if (!v[i])
{
p[++t] = i; num[i] = 1;
if (i % 4 == 1) f[i] = 3; else f[i] = 1;
}
for(int j = 1; j <= t && i * p[j] <= n; j++)
{
v[i * p[j]] = 1;
if (i % p[j]) f[i * p[j]] = f[i] * f[p[j]], num[i * p[j]] = 1;
else
{
num[i * p[j]] = num[i] + 1;
if (p[j] % 4 == 1)
f[i * p[j]] = f[i] / (2 * num[i] + 1) * (2 * num[i] + 3);
else f[i * p[j]] = f[i];
break;
}
}
}
for(int i = 2; i <= n; i++) ans += (f[i] - 1) >> 1;
printf("%d\n", ans);
return 0;
}