NOIP2018提高组省一冲奖班模测训练(二)T1 LXL的雕像

10月22日NOIP2018提高组省一冲奖班模测训练(二)

T1 LXL的雕像

题目描述

 地主lxl拥有一块n×m的土地,有一天他突发奇想,想要在自己的土地上建造若干雕像来纪念自己的伟业。
 已知每个雕像底座的尺寸均为l×l。为了美观, lxl想把雕像排列成一个矩形网格,每个雕像与其相邻的雕像(或者与土地边缘)的距离x全部相等,如下图所示.x可以为任意非负实数.lxl想在土地上摆尽可能多的雕像,请你告诉他此时x的取值应为多少。

输入格式

一行三个正整数表示l,n,m

输出格式

一行一个实数x,精确到小数点后六位。
如果无法摆下雕像,输出-1。

输入样例

2 18 13

输出样例

0.500000

数据范围

对于40%的数据,1≤a,h,w≤10^ 6 
对于100%的数据,1≤a,h,w≤10^ 9 


思路

我们记雕像的个数为N,则

                                   N = \ frac {n-x} {l + x} * \ frac {m  -  x} {l + x}
显然,N是整数,则
\ frac {n  -  x} {l + x}\ frac {m  -  x} {l + x}都是整数
那么分子分母都含有x,不太好计算,那么再进行分离整数,得
                                  \ frac {n  -  x} {l + x} = \ frac {n + l} {l + x}  -  1,\ frac {m  -  x} {l + x} = \ frac {m + l} {l + x}  -  1
所以\ frac {n + l} {l + x}和  \ frac {m + l} {l + x}都是整数,易得l + xGCD(N + 1,M + L)的因数
G = gcd(n + 1,m + 1)\ frac {G} {l + x} = k(k \ in N _ {+},x \ geq 0)

                                   \ frac \ {​{​{​{​{​{​{​{​{​{​
所以,这道题就完美的被解决了,上代码ヽ(¯▽¯)ノ

代码

#include <iostream>
#include <cstdio>

using namespace std;

int l, m, n, g;
double x;

int gcd (int a, int b)
{
	return b == 0 ? a : gcd (b, a % b);
}

int main ()
{
	scanf ("%d %d %d", & l, & n, & m);
	g = gcd (m + l, n + l);
	if (g < l || n < l || m < l){
		printf ("-1");
		return 0;
	}
	g = gcd (m + l, n + l);
	x = 1.0 * g / (g / l) - l;
	printf ("%.6lf", x);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值