LightOJ 1366 - Pair of Touching Circles (在矩形中只需要两个圆相外切,有多少种) 半径圆心均为整数)
Posted 老板,来一盆泪流满面
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1366 - Pair of Touching Circles (在矩形中只需要两个圆相外切,有多少种) 半径圆心均为整数)相关的知识,希望对你有一定的参考价值。
题意: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\n",t++,sum); } return 0; }
以上是关于LightOJ 1366 - Pair of Touching Circles (在矩形中只需要两个圆相外切,有多少种) 半径圆心均为整数)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子
LightOJ.1265.Island of Survival(概率)
LightOJ - 1265 Island of Survival 期望
LightOJ 1065 Island of Survival (概率DP?)