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

本文探讨了圆的反演几何概念,并提供了一种算法实现方案,通过使用C++编程语言,详细介绍了如何将圆的反演应用于解决特定数学问题,包括切点选择、反演半径设定及结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://nanti.jisuanke.com/t/A1283

怎么圆的反演全是2017出的题

以上面两个圆的切点为反演点,反演半径为R,那么左右两个圆就变成了lx=-R/2和rx=R/2的两条垂直的直线

然后与这左右两个圆相切的就是夹在两条直线之间的,又因为与下面的圆也相切,所以所有圆的半径都是R/2,纵坐标减一减就行

#include<bits/stdc++.h>
using namespace std;

const double eps=1e-7;

inline int sgn(double x)
{
	if(x>-eps && x<eps) return 0;
	if(x>0) return 1;
	else	return -1;
}

struct point
{
	double x,y;
	point (double a=0,double b=0)
	{
		x=a;y=b;
	}
	point operator + (const point &b)const
	{
		return point(x+b.x,y+b.y);
	}
	point operator - (const point &b)const
	{
		return point(x-b.x,y-b.y);
	}
	point operator * (const double &t)const
	{
		return point(x*t,y*t);
	}
};
struct circle
{
	point o;
	double r;
};
inline double sqr(double x){return x*x;}
inline double det(const point &a,const point &b)
{
	return a.x*b.y-a.y*b.x;
}
inline double dist(const point &a,const point &b)
{
	return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
inline circle inversion(circle a,point p,double R)
{
    circle res;
    double d1=dist(p,a.o);
    res.r=a.r*R*R/(sqr(d1)-sqr(a.r));
    double d2=R*R/(d1-a.r)-res.r;
    res.o=p+(a.o-p)*(d2/d1);
    return res;
}

int k;
double R;
circle a,c,ans;

int main()
{
	int t;double lx,rx;
	while(~scanf("%d",&t))
	{
		if(t<0) return 0;
		scanf("%lf",&R);
		a.o=point(0,0);a.r=R;
		lx=-R/2;rx=R/2;
		c.o=point(0,-R*sqrt(3.0));c.r=R;
		c=inversion(c,a.o,a.r);
		for(int i=1;i<=t;i++)
		{
			scanf("%d",&k);
			ans.o=point(0,c.o.y-k*R);
			ans.r=R/2;
			ans=inversion(ans,a.o,a.r);
			printf("%d %d\n",k,(int)ans.r);
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值