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

版权声明:本文为博主原创文章,转载请标明出处 https://blog.csdn.net/MOMING_V/article/details/83280790

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+l,m+l)的因数
G = gcd ( n + l, m + l)\frac{G}{l + x} = k(k\in N_{+}, x \geq 0)

                                   \frac{G}{k} = l + x \geq l, k = [\frac{G}{l}]
so, 这道题就完美的被解决了,上代码ヽ( ̄▽ ̄)ノ

代码

#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;
}

猜你喜欢

转载自blog.csdn.net/MOMING_V/article/details/83280790