#include <iostream>
typedef long long ll;
using namespace std;
bool ll_is_valid(ll t, ll N, ll x, ll y)
{
return t / x + (t - x) / y >= N;
}
ll f(ll N, ll x, ll y)
{
ll R = 1;
while (!ll_is_valid(R,N,x,y)) R *= 2;
ll L = R / 2;
while(R - L > 1)
{
ll M = (L + R) / 2;
if (!ll_is_valid(M,N,x,y)) {L = M;}
else {R = M;}
}
return R;
}
int main()
{
ll N,x,y;
cin >> N >> x >> y;
if(x > y) swap( x, y );
cout << f(N, x, y) << std::endl;
}
Поделитесь своими знаниями, ответьте на вопрос:
Решить 1. выпишите недопустимые имена переменных: a) nomer; b) s34; c) и92; d) kol_vo54; e) 45_a; i) fg-л23 2. установите соответствие (с стрелок) между переменной и типом данных: а) a: =3.234 а) integer b) z: =14 b) real c) b: =10351 c) byte d) k: =-0.2 d) word e) c: = 64000 3. запишите инструкцию: а) присваивающую переменной v значение 7; б) увеличивающую значение переменной z на 30; 4. напишите инструкцию вывода на экран: а) вашего имени б) числа 400 5. установите соответствие между служебными словами и названиями разделов программы: а) var а) раздел операторов b) program b) раздел имени программы c) uses c) раздел описания переменных d) begin …end d) раздел описания библиотечных модулей 6. найдите ошибки в записях оператора: a) write ©; b) writeln; c) writeln (введите любое число); d) write x, y; e) writeln (‘воскресенье, нерабочий день’); буду : 3
Верный ответ: e)45_A; и i)fg-л23.
2. В данном вопросе нужно расставить отношение, однако слева на 1 больше,чем справа, поэтому отвечаю как написан вопрос.
В данном случае типы данных можно сразу разделить на "целочисленные" (integer, byte,word) и "с плавающей точкой" (real). каждый из них имеет свой диапазон значений:
Byte [0..255]
Word [0..65535]
Integer [-32768..32767]
Real [-39..38] (однако в разных версиях паскаля может различаться)
Таким образом, числа с дробной частью сразу уходят к типу Real. Число 64000 автоматически отправляется к типу Word. 10351 - приходится на тип Integer. Число 14 остается для типа Byte.
ответ: a) A:=3.234=> b) Real
b) Z:=14=> c) Byte
c) B:=10351=> a) Integer
d) K:=-0.2=> b) Real
e) C:= 64000=> d) Word
3. a) Переменная - оператор присваивания - значение -;
V:=7;
b) Переменная Z - оператор присваивания - переменная Z + 30 - ;
Z:=Z+30;
ответ: a) V:=7; b) Z:=Z+30
4. Вывод на экран производится оператором Write();
а) Для вывода на экран символьной строки, в скобках оператора ставятся одинарные кавычки в которых пишется желаемое сообщение.
Write('Имя');
b) Для вывода на экран числа,которое не является сообщением, число или же переменную в скобках оператора ставят после запятой, которая ставится после кавычек сообщения.
Write(' ',400);
ответ: a)Write('Имя'); b) Write(' ',400);
5. a) Var => c) Раздел описания переменных
b) Program => b) Раздел имени программы
c) Uses => d) Раздел описания библиотечных модулей
d) Begin …end => а) Раздел операторов
ответ: a)=>c)
b)=>b)
c)=>d)
d)=>a)
6. Рассмотрим каждый случай на ошибку:
a) Write ©; - в данном случае после оператора вывода сразу же идет символ, что недопустимо компилятором - следовательно ошибка в том,что этот символ должен находится в скобках и кавычках,а именно таким образом: Write('©');
b) Writeln; - в этом случае критической ошибки нет, так как суффикс ln у оператора обозначает,что после его выполнения будет сделан переход каретки вывода на следующую строку.
c) Writeln (Введите любое число); - как я уже указывал ранее, сообщение,которое мы хотим вывести на экран должно находится внутри скобок в кавычках, которых здесь нет. В этом и заключается ошибка в этом случае. Правильно эта команда выглядит так: Writeln ('Введите любое число');
d) Write X,Y; - Ошибка аналогичная варианту выше, за исключением того,что в этот раз используются переменные для вывода на экран,а значит они должны быть описаны для данного оператора в скобках, после кавычек и запятой : Write (' ', X , Y);
e) WRITELN (‘воскресенье, нерабочий день’); - Оператор написан большими буквами, что не является ошибкой, так как не разделяет регистры букв. В скобках все указано верно (кавычки видимо стоят такие ' ', если же нет - то в них ошибка).