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

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

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

题目描述

假设圆的圆心位于(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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值