BZOJ 1041 圓上的整點

最開始的時候想用暴力的思路,從-R搜到R,後來一看數據,毀了數據太大。接着想到優化,圓加座標能夠抽象的分解爲全等的八塊,所以只需求從二分之根號二R到R的整點中符合要求的,可是依然超時了,後來仔細分析了一下後發現,這根本就是一道數學題,詳解以下:優化

20130818133251390

根據上述描述獲得程序以下:spa

#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;
}
感謝各位的觀看,但願能有所收穫,謝謝。
相關文章
相關標籤/搜索