BZOJ 1041 圆上的整点

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

20130818133251390

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

#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;
}
感谢各位的观看,希望能有所收获,谢谢。
posted @ 2015-07-30 18:58  wlxy  阅读(91)  评论(0编辑  收藏