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