1.题目链接。给定半径,找一下这个圆上有多少个整点。其实也就是格点。
2.这个题目其实是比较有意思的,做法也有很多种。比较常规的解法是:
到这里其实就好办了,因为x是一个平方数,A,B互质,所以A,B也应该是一个平方数。
所以枚举2*r的因子,然后计算数量即可。
其实这个题目里面涉及到了一些比较有趣的东西:首先是一个结论:
然后这个题目更深层次的涉及到了高斯素数,有兴趣的可以学习一下。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int res;
#pragma warning(disable:4996)
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
bool check(ll n)
{
ll sq = sqrt(n);
return sq * sq == n;
}
void solve(ll rr)
{
for (ll i = 1;i*i<= rr; i++)
{
ll t = rr - i * i;
if (!check(t))continue;
ll j = sqrt(rr - i * i);
if (i >= j)break;
if (gcd(i*i, t) == 1)
res++;
}
}
int main()
{
ll r;
scanf("%lld", &r);
res = 1;
r <<= 1;
for (ll d = 1;d*d <= r; d++)
{
if (r% d != 0) continue;
solve(r / d);
if (d*d== r) break;
solve(d);
}
printf("%d\n", res << 2);
return 0;
}