您的位置:首页 > 其它

bzoj1041 [HAOI2008]圆上的整点 gcd

2017-12-19 19:16 495 查看
这个题非常恶心,因为条件很少,要求也很少,看起来没有任何特殊的性质

所以只能往约数、gcd上靠

然后就是 

x^2=r^2-y^2=(r-y)(r+y)

设A=r-y, B=r+y 

由于A*B是完全平方数, 设d=gcd(A,B)

则 gcd(A/d,B/d)=1

设A=u*d B=v*d

所以u=(r-y)/d , v=(r+y)/d

则v+u=2r/d  

则u和v都是完全平方数

再设 u=a*a , v=b*b

枚举2r的因子d ,  再枚举a, 统计答案

码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,i,j,a,b,ans;
long long gcd(long long a,long long b)
{
if(!b)return a;
return gcd(b,a%b);
}
int main()
{
scanf("%lld",&n);
for(i=1;i*i<=2*n;i++)
{
if((2*n)%i==0)
{
for(j=1;j*j<=2*n/i;j++)//d==i
{
a=j*j;
b=2*n/i-a;
if(b<=0)break;
long long p=sqrt(b);
if(gcd(a,b)==1&&(p*p)<=(b)&&(p*p)>=(b))
{
ans+=1;
}
}
if(i*i!=2*n)
{
for(j=1;j*j<=i;j++)//d==2*n/i
{
a=j*j;
b=2*n/(2*n/i)-a;
if(b<=0)break;
long long p=sqrt(b);
if(gcd(a,b)==1&&(p*p)<=(b)&&(p*p)>=(b))
{
ans++;
}
}
}
}
}
printf("%lld",(ans*4+4)/2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: