码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1041 圆上的整点

时间:2015-07-30 21:02:42      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

最开始的时候想用暴力的思路,从-R搜到R,后来一看数据,毁了数据太大。接着想到优化,圆加坐标可以抽象的分解为全等的八块,因此只需求从二分之根号二R到R的整点中符合要求的,但是依然超时了,后来仔细分析了一下后发现,这根本就是一道数学题,详解如下:

技术分享

根据上述描述得到程序如下:

#include<cstdio>
#include<set>
#include<utility>
#include<cmath>
 
using namespace std;
 
set<pair<int,int> > s;
long long int r; 
 
void search(int x,int y)
{
    if(x%4!=1) return;
 
    int sx=sqrt(x/2);
    for(int i=1;i<=sx;i++)
    {
        int t=sqrt(x-i*i);
        if(t*t==x-i*i)
        {
            int tx=t*t-i*i,ty=2*t*i;
            if(tx>0)
            {
                if(tx<ty)
                {
                    int tmp=tx;tx=ty;ty=tmp;
                }
                s.insert(make_pair(tx*y,ty*y));
            }
        }
    }
}
 
int main()
{
    scanf("%d",&r);
 
    int sr=sqrt(r);
 
    for(int i=1;i<=sr;i++)
    {
        if(!(r%i))
        {
            search(i,r/i);
            if(i*i!=r) search(r/i,i);
        }
    }
 
    printf("%d\n",s.size()*8+4);
 
    return 0;
}
感谢各位的观看,希望能有所收获,谢谢。

BZOJ 1041 圆上的整点

标签:

原文地址:http://www.cnblogs.com/szy-wlxy/p/4690304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!