BZOJ 1041 圆上的整点
最开始的时候想用暴力的思路,从-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; }