P2508 [HAOI2008]圆上的整点

题目链接

题意分析

这道题就是要你推式子主要是俺也不懂什么高斯素数

对于

\[x^2+y^2=r^2 \]

我们转化为

\[y^2=r^2-x^2=(r+x)(r-x)=dx*dy\ \ \ (x⊥y) \]

由于\(x⊥y\) 那么我们一定可以转化为如下形式

\(x=s^2\ \ \ y=t^2\)

\[y^2=d^2*s^2*t^2\ \ \ 即y=dst \]

同时

\[r=d\frac{s^2+t^2}{2}\ \ \ \ \ x=d\frac{s^2-t^2}{2} \]

利用左式我们可以枚举约数\(2^r\)的约数\(s^2+t^2\) 然后枚举\(s\)确定\(x\)以及\(y\) 从而求出个数

同时不要忘了这里求出的\(x,y\)都是非负数 而符合要求的\(x,y\)可正可负 所以还要*4

CODE:

#include<bits/stdc++.h>
#define M 1007511 
using namespace std;
long long n;
int ans;
long long gcd(long long x,long long y)
{return y ? gcd(y,x%y):x;}
void solve(long long x,long long d)
{
	for(long long i=1;i*i<=(x>>1);++i)
	{
		long long y=sqrt((x-i*i));
		if(i*i+y*y==x&&gcd(i,x)==1) 
		{
			long long le=(d*(y*y-i*i))/2;
			long long ri=sqrt(n*n-le*le);
			if(le*le+ri*ri==n*n)
			{
				++ans;
//				printf("%lld %lld %lld\n",le,ri,n);
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(long long i=1;i*i<=(n<<1);++i)
	{
		if((n<<1)%i) continue;
		long long cdy=i,wzy=(n<<1)/i;
		solve(cdy,wzy);
		if(cdy!=wzy) solve(wzy,cdy);
	}
	printf("%d\n",ans*4);
	return 0;
}
posted @ 2021-02-04 13:31  tcswuzb  阅读(62)  评论(0编辑  收藏  举报