<center>

1015: 圆上的点点点点点点点点点点点点点点

时间限制: 1 Sec  内存限制: 128 MB
提交: 152  解决: 17

</center>

题目描述

假设圆的圆心位于(0,0),圆的"某积"公式为S=a2,请问"某积"为s的圆上有多少个以整数为坐标的点?

输入

多组测试数据,请处理到文件结束。

对于每组测试数据,只包含一个整数S。

1<=S<=2,000,000,000。

输出

输出一个整数,代表以整数为坐标的点的个数。

样例输入

253

样例输出

120

提示


没有Hint了

来源

河海ACM前辈-汪之涛



思路:

题意很明白,实际上就是遍历找符合题目的点。一开始用去遍历a,用a^2和S相比看是否符合,但是这样肯定会超时,因为数太大了。之后的想法就是,开根号S,遍历根号S看是否和a想匹配。因为可能会由于根号取整而损失精度,所以,要在根号S的附近的三个值,√S,√S-1,√S+1,这三个数如果有匹配的那么就是符合的。所以说,根号很能简化运算。之前的一道题也是用了根号才过的...一般都是10的18次方一开根号简化10的9次方数量级的运算。根号大法万岁!


代码:

#include<iostream>
#include<cmath>
using namespace std;
 
int main()
{   
    long int S;
    while(scanf("%d",&S)!=EOF)
    {
    double s=sqrt(S);
    int num=0;
    for(int i=1;i<s;i++)
    {
        int j=sqrt((S-i*i));
        if(i*i+(j+1)*(j+1)==S)num++;
        if(i*i+(j)*(j)==S)num++;
        if(i*i+(j-1)*(j-1)==S)num++;
         
    }
    if(s!=int(s))cout<<num*4<<endl;
    else cout<<num*4+4<<endl;
    }
}