1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4298 Solved: 1944
[Submit][Status][Discuss]
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
只有一个正整数n,n<=2000 000 000
Output
整点个数
Sample Input
4
Sample Output
4
HINT
/* * @Author: lyuc */ /* 题意:就是求有多少斜边为n的勾股数; 思路:y*y=r*r-x*x =(r-x)*(r+x) 令 d=GCD(r-x,r+x) 那么 r-x=d*u*u r+x=d*v*v 并且GCD(u,v)==1 得到 r=d*(u*u+v*v)/2 y=d*d*u*u*v*v x=d*(v*v-u*u) 这样枚举r的因子,在枚举u,注意x,y,r的范围就可以了 */ #include <bits/stdc++.h> #define LL long long using namespace std; LL r; LL res; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } void cal(LL d){ LL v; for(LL u=1;u<=sqrt(2*r*1.0/d);u++){ v=(LL)sqrt( (2*r*1.0/d-u*u)*1.0 ); if(gcd(u,v)==1&&u<=v&&d*(u*u+v*v)==2*r){ res++; } } } int main(int argc, char *argv[]) { //freopen("in.txt","r",stdin); res=0; scanf("%lld",&r); for(LL i=1;i<=sqrt(2*r*1.0);i++){ if(2*r%i==0){ if((LL)i*i==2*r){ cal(i); }else{ cal(i); cal(2*r/i); } } } printf("%lld\n",res*4); return 0; }
我每天都在努力,只是想证明我是认真的活着.