SP2901 GEOPROB - One Geometry Problem 题解

SP2901 GEOPROB - One Geometry Problem 题解

什么小学几何题。

解法

小学三年级学的构造弦图,容易得到线图中四个三角形都全等。如图。

图片

a = c − d + d − b + c − d = 2 c − b − d \begin{aligned}a & = c-d+d-b+c-d \\ & = 2c-b-d\end{aligned} a=cd+db+cd=2cbd

证明都在图里了,这里不再多说。

顺带一提,本题要写高精度,这里给部分封装过的模板,开封即用。

class high_accuracy
{
private:
	int len,a[210];
public:
	high_accuracy()
	{
		len=0,memset(a,0,sizeof(a));
	}
	inline void clear()
	{
		len=0,memset(a,0,sizeof(a));
	}
	inline int &operator[](const int x)
	{
		return a[x];
	}
	inline int size()
	{
		return len;
	}
	inline void init(__int128 x)
	{
		len=0,memset(a,0,sizeof(a));
		if(x==0) len=1;
		while(x) a[++len]=x%10,x/=10;
	}
	inline void input()
	{
		std::string st;
		std::cin>>st,len=0,memset(a,0,sizeof(a));
		for(int i=st.size()-1;i>=0;i--) a[++len]=st[i]^48;
	}
	inline void deal(int l)
	{
		for(int i=1;i<=l;i++) a[i+1]+=a[i]/10,a[i]%=10;
		len=l;
		for(int i=1;i<=l;i++) if(a[i]<0) a[i+1]-=(abs(a[i])-1)/10+1,a[i]+=((abs(a[i])-1)/10+1)*10;
		while(!a[len]) len--;
	}
	inline void print()
	{
		for(int i=std::max(len,1);i;i--) std::cout<<a[i];
	}
	inline high_accuracy operator+(high_accuracy rhs)
	{
		high_accuracy ret;
		int le=std::max(len,rhs.size());
		for(int i=1;i<=le;i++) ret[i]+=a[i]+rhs[i],ret[i+1]=ret[i]/10,ret[i]%=10;
		ret.deal(le+2);
		return ret;
	}
	inline high_accuracy operator-(high_accuracy rhs) // 适用于 *this 比 rhs 大的情况
	{
		high_accuracy ret;
		int le=std::max(len,rhs.size());
		for(int i=1;i<=le+3;i++) ret[i]=0;
		for(int i=1;i<=le;i++) ret[i]+=a[i]-rhs[i];
		ret.deal(le+2);
		return ret;
	}
};

代码

#include<bits/stdc++.h>
int n;
class high_accuracy
{
	/**
	 * 封装内容如上
	*/
};
high_accuracy a,b,c,d;
int main()
{
	std::cin>>n;
	while(n--) b.input(),c.input(),d.input(),a.clear(),a=c+c-b-d,a.print(),std::cout<<'\n';
	return 0;
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值