版权声明:本文为博主原创文章,转载请标明出处 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是整数, 则
和都是整数
那么分子分母都含有x,不太好计算,那么再进行分离整数,得
所以和 都是整数, 易得是的因数
记,则
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;
}