题意:http://www.lightoj.com/volume_showproblem.php?problem=1366
利用圆心距,将各个圆心半径都模拟出来,然后找到最小矩形 最后求出总数
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 1000009 #define Lson rood<<1 #define Rson rood<<1|1 #define PI acos(-1) int main() { int T,t=1; scanf("%d",&T); while(T--) { int H,W;///求出不同圆心距时 两圆所占的最小矩形 scanf("%d%d",&H,&W); LL sum=0; for(int i=0;i<=H/2;i++)///模拟两圆圆心 一圆心为(0,0),另一个为(i,j) { for(int j=0;j<=W/2;j++) { int d=(int)sqrt(i*i+j*j); if(d*d!=i*i+j*j) continue;///全为整数 圆心距也是整数 for(int r=1;r<d;r++) { LL ans=0;///根据半径大小 求出两圆所在的最小矩形 int x=max(r,i+d-r)-min(-r,i-d+r); int y=max(r,j+d-r)-min(-r,j-d+r); if(x>H||y>W) continue; ans=(H-x+1)*(W-y+1); if(i*j) ans*=2;///存在(3,4)的情况 分别为向上和向下 所以要乘2 sum+=ans; } } } printf("Case %d: %lld ",t++,sum); } return 0; }