<center>
提交: 152 解决: 17
</center>
1015: 圆上的点点点点点点点点点点点点点点
时间限制: 1 Sec 内存限制: 128 MB提交: 152 解决: 17
</center>
题目描述
假设圆的圆心位于(0,0),圆的"某积"公式为S=a2,请问"某积"为s的圆上有多少个以整数为坐标的点?
输入
多组测试数据,请处理到文件结束。
对于每组测试数据,只包含一个整数S。
1<=S<=2,000,000,000。
输出
输出一个整数,代表以整数为坐标的点的个数。
样例输入
253
样例输出
120
提示
没有Hint了
来源
思路:
题意很明白,实际上就是遍历找符合题目的点。一开始用去遍历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;
}
}