Количество диагоналей
в n-угольнике не менее N. Какое наименьшее значение может принимать
n?
Вход. Содержит не более 1001 строк. В каждой строке
записано натуральное число N (N £ 1015)
– минимальное
количество диагоналей. Последняя строка содержит 0 и не
обрабатывается.
Выход. Для каждого теста в
отдельной строке выведите его номер и наименьшее возможное значение n –
количество сторон многоугольника.
Пример
входа |
Пример
выхода |
10 100 1000 0 |
Case 1: 7 Case 2: 16 Case 3: 47 |
математика
Каждая вершина выпуклого
многоугольника соединена отрезками с остальными n – 1 вершинами. Из них два отрезка образуют стороны, а
остальные n − 3 являются диагоналями. Так как всего вершин n,
и из каждой выходит n − 3 диагонали, то общее
число диагоналей в выпуклом n-угольнике равно n * (n –
3) / 2 (так
как каждая диагональ учитывается дважды).
Если n *
(n – 3) / 2 = N, то значение n можно найти из квадратного уравнения:
n2 – 3 * n –
2 * N = 0
Положительный
корень этого уравнения равен
Остается
округлить это
значение вверх до ближайшего целого. Поскольку N £ 1015, все вычисления следует производить с использованием
типа данных long
long.
Пример
Рассмотрим
второй тест. Для N = 100 получим
n = = 16
Номер текущего
теста будем хранить в переменной cs.
int cs = 1;
Читаем входные данные до тех пор, пока значение N больше нуля.
while(scanf("%lld",&n),
n > 0)
{
Для каждого значения N вычисляем
результат по формуле и выводим его вместе с номером теста.
res = int(ceil((3 + sqrtl(9.0 + 8*n)) / 2));
printf("Case %d: %d\n",cs,res);
cs++;
}
Java реализация
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
long n, cs = 1;
while((n = con.nextLong()) > 0)
{
long res = (int)(Math.ceil((3
+ Math.sqrt(9 + 8*n))/2));
System.out.println("Case " + cs + ": " + res);
cs++;
}
}
}