G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

Posted weeping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛相关的知识,希望对你有一定的参考价值。

地址:https://nanti.jisuanke.com/t/17314

题目:

Three circles C_{a}Ca​​, C_{b}Cb​​, and C_{c}Cc​​, all with radius RR and tangent to each other, are located in two-dimensional space as shown in Figure 11. A smaller circle C_{1}C1​​ with radius R_{1}R1​​ (R_{1}<RR1​​<R) is then inserted into the blank area bounded by C_{a}Ca​​, C_{b}Cb​​, and C_{c}Cc​​ so that C_{1}C1​​ is tangent to the three outer circles, C_{a}Ca​​, C_{b}Cb​​, and C_{c}Cc​​. Now, we keep inserting a number of smaller and smaller circles C_{k}\\ (2 \\leq k \\leq N)Ck​​ (2kN) with the corresponding radius R_{k}Rk​​ into the blank area bounded by C_{a}Ca​​, C_{c}Cc​​ and C_{k-1}Ck1​​ (2 \\leq k \\leq N)(2kN), so that every time when the insertion occurs, the inserted circle C_{k}Ck​​ is always tangent to the three outer circles C_{a}Ca​​, C_{c}Cc​​ and C_{k-1}Ck1​​, as shown in Figure 11

Figure 1.

(Left) Inserting a smaller circle C_{1}C1​​ into a blank area bounded by the circle C_{a}Ca​​, C_{b}Cb​​ and C_{c}Cc​​.

(Right) An enlarged view of inserting a smaller and smaller circle C_{k}Ck​​ into a blank area bounded by C_{a}Ca​​, C_{c}Cc​​ and C_{k-1}Ck1​​ (2 \\leq k \\leq N2kN), so that the inserted circle C_{k}Ck​​ is always tangent to the three outer circles, C_{a}Ca​​, C_{c}Cc​​, and C_{k-1}Ck1​​.

Now, given the parameters RR and kk, please write a program to calculate the value of R_{k}Rk​​, i.e., the radius of the k-thkth inserted circle. Please note that since the value of R_kRk​​ may not be an integer, you only need to report the integer part of R_{k}Rk​​. For example, if you find that R_{k}Rk​​ = 1259.89981259.8998 for some kk, then the answer you should report is 12591259.

Another example, if R_{k}Rk​​ = 39.102939.1029 for some kk, then the answer you should report is 3939.

Assume that the total number of the inserted circles is no more than 1010, i.e., N \\leq 10N10. Furthermore, you may assume \\pi = 3.14159π=3.14159. The range of each parameter is as below:

1 \\leq k \\leq N1kN, and 10^{4} \\leq R \\leq 10^{7}104​​R107​​.

Input Format

Contains l + 3l+3 lines.

Line 11: ll ----------------- the number of test cases, ll is an integer.

Line 22: RR ---------------- RR is a an integer followed by a decimal point,then followed by a digit.

Line 33: kk ---------------- test case #11, kk is an integer.

\\ldots

Line i+2i+2: kk ----------------- test case # ii.

\\ldots

Line l +2l+2: kk ------------ test case #ll.

Line l + 3l+3: -11 ---------- a constant -11 representing the end of the input file.

Output Format

Contains ll lines.

Line 11: kR_{k}Rk​​ ----------------output for the value of kk and R_{k}Rk​​ at the test case #11, each of which should be separated by a blank.

\\ldots

Line ii: kR_{k}Rk​​ ----------------output for kk and the value of R_{k}Rk​​ at the test case # ii, each of which should be separated by a blank.

Line ll: kR_{k}Rk​​ ----------------output for kk and the value ofR_{k}Rk​​ at the test case # ll, each of which should be separated by a blank.

样例输入

1
152973.6
1
-1

样例输出

1 23665

题目来源

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

 

思路:

  圆的反演。

  很容易想到把上面两大圆的切点作为反演中心,这样会得到下图。

  绿色的是反演前的圆,黄色的是反演后的图形,两个大圆成了平行直线,下面的大圆成了直线间的小圆,后面添加的圆都在这个小圆的下面。

  所以求出小圆的圆心的y即可,然后反演回去可以得到半径。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define MP make_pair
 6 #define PB push_back
 7 typedef long long LL;
 8 typedef pair<int,int> PII;
 9 const double eps=1e-8;
10 const double PI=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13 
14 
15 int main(void)
16 {
17     double r,x,y,ls,dis,ans[11];
18     int t;
19     cin>>t>>r;
20     x=0.5*r,ls=-0.5*sqrt(3.0)*r;
21     dis=x*x+ls*ls;
22     ls=ls/dis;
23     r=1.0/(2*r);
24     for(int i=1;i<=10;i++)
25     {
26         y=ls-r*2;
27         ans[i]=0.5*(1.0/(y-r)-1.0/(y+r));
28         ls=y;
29     }
30     for(int i=1,k;i<=t;i++)
31         scanf("%d",&k),printf("%d %d\\n",k,(int)ans[k]);
32     return 0;
33 }

 

以上是关于G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛的主要内容,如果未能解决你的问题,请参考以下文章

Constants and the C Preprocessor

使用SASS for Ruby on Rails时如何使用border-radius属性删除导航栏圆角?

python跳过for循环

The Prediction for Filecoin for the year 2021

the ECDSA host key for ‘pc2‘ differs from the key for the IP address ‘192.168.144.250‘

the ECDSA host key for ‘pc2‘ differs from the key for the IP address ‘192.168.144.250‘