BNU - Pair of Touching Circles - 数学题,找矩形

题意:

给定一个矩形,问在这个矩形当中半径和圆心均为整数的相切圆有多少个。

解:

又是找矩形,给跪了。。。原来矩形这么有用的。。

先枚举直角三角形直角边,得到斜边。枚举端点在斜边端点,在斜边相切的圆半径。由固定的斜边、两个圆得到固定的矩形。对于每个矩形,由于对称,所以要加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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值