题意:
给定一个矩形,问在这个矩形当中半径和圆心均为整数的相切圆有多少个。
解:
又是找矩形,给跪了。。。原来矩形这么有用的。。
先枚举直角三角形直角边,得到斜边。枚举端点在斜边端点,在斜边相切的圆半径。由固定的斜边、两个圆得到固定的矩形。对于每个矩形,由于对称,所以要加2。
还有另外一种情况,即直角三角形的一条边为0,那么枚举的斜边与矩形边平行,最后只加1.
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1011;
short int f[2000010];
int data[maxn][maxn];
int g[maxn][maxn];
void init(){
for(int i = 0; i * i <= 2000000; i ++)
f[i * i] = i;
for(int x = 0; x < maxn; x ++){
for(int y = (x == 0); y < maxn; y ++){
int t = x * x + y * y;
t = f[t];
for(int r0 = 1; r0 < t; r0 ++){
int r1 = t - r0;
int u = max(x + r0 + r1, 2 * max(r0, r1));
int v = max(y + r0 + r1, 2 * max(r0, r1));
if(u < 1001 && v <= 1001)
g[u][v] += 1 + (x && y);
}
}
}
}
int main()
{
init();
int kase,__=1;
scanf("%d",&kase);
while(kase--)
{
int n,m;
long long ans=0;
scanf("%d%d",&n,&m);
for(int x=1; x<=n; x++)
for(int y=1; y<=m; y++)
ans = ans+(long long)g[x][y]*(n-x+1)*(m-y+1);
printf("Case %d: %lld\n",__++,ans);
}
return 0;
}