HHUOJ 1015 圆上的点点点点点点点点点点点点点点(根号优化计算)

<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;
    }
}

 
全部评论

相关推荐

AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务