Задача1

1.  Дана последовательность натуральных чисел 7, 11, 13, 14, 19, 21, 22, 25, :.

Требуется написать программу, которая по заданному N находит N-ый член этой последовательности.

Ограничение времени: 1 секунда на тест.

Входные данные

Входной файл INPUT. TXT содержит число N (1000 ≤ N ≤ 2147483647).

Выходные данные

В выходной файл OUTPUT. TXT выведите N-ый член последовательности.

Примеры

INPUT. TXT

OUTPUT. TXT

1

1005

524672

2

2100

16781824

ОТВЕТ 1

Рассмотрев двоичные разложения представленных элементов последовательности, можно сделать вывод о том, что в последовательность входят только те натуральные числа, у которых три единицы в двоичном разложении. Таким образом, n-й член последовательности имеет вид 2k1+2k2+2k3. l+1-значных двоичных чисел с тремя единицами всего l*(l-1)/2. Это позволяет найти k1. Из аналогичных соображений находим k2 и k3. Для вычисления значения самого n-го члена воспользуемся схемой Горнера 2k1+2k2+2k3=((2k1-k2+1)*2k2-k3+1)*2k3. Для вычисления последнего выражения надо использовать в длинной арифметике две операции: умножение на два и добавление единицы.

var

n, l : longint;

k1,k2,k3,k, i,j, p : integer;

a : array [1..1000] of integer;

begin

assign(input, 'input. txt'); reset(input);

assign(output, 'output. txt'); rewrite(output);

read(n);

l:=2; while n-l*(l-1) div 2 > 0 do begin

n:=n-l*(l-1) div 2; l:=l+1 end; k1:=l;

l:=1; while n-l>0 do begin

n:=n-l; l:=l+1; end; k2:=l; k3:=n-1;

НЕ нашли? Не то? Что вы ищете?

a[1]:=1; k:=1;

for i:=1 to k1-k2 do begin

p:=0; for j:=1 to k do begin

p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10 end;

if p>0 then begin k:=k+1; a[k]:=p end end;

a[1]:=a[1]+1;

for i:=1 to k2-k3 do begin

p:=0; for j:=1 to k do begin

p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10 end;

if p>0 then begin k:=k+1; a[k]:=p end end;

a[1]:=a[1]+1;

for i:=1 to k3 do begin

p:=0; for j:=1 to k do begin

p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10 end;

if p>0 then begin k:=k+1; a[k]:=p end end;

for i:=k downto 1 do write(a[i]);

close(output)

end.

Задача 2

Для содержания двух воинственных инопланетян Aки и Bуки используется клетка с многослойной перегородкой, которая изготавливается из имеющихся N сеток. Для каждой сетки i (i = 1, :, N) известно время ее разрушения инопланетянином Aки - ai и инопланетянином Bуки - bi. Разрушение сетки каждым из инопланетян происходит последовательно слой за слоем, с постоянной скоростью по толщине сетки.

Требуется написать программу проектирования такой перегородки, время разрушения которой было бы максимальным.

Ограничение времени: 1 секунда на тест.

Входные данные

В первой строке входного файла INPUT. TXT записано число N (1 ≤ N ≤ 256). В каждой из последующих N строк содержатся два положительных вещественных числа ai и bi, разделенные пробелом.

Выходные данные

В первую строку выходного файла OUTPUT. TXT записать время разрушения перегородки с точностью, не меньшей 10-3. В следующую строку файла записать номера сеток в порядке их расположения от инопланетянина Aки к инопланетянину Bуки, разделяя числа пробелами.

Пример

INPUT. TXT

OUTPUT. TXT

1

4
1 2
1 2
0.5 1.5
7 3.5

6.000
4 2 1 3

ОТВЕТ 2

Необходимо отсортировать перегородки по отношению времён их разрушения инопланетянами. После этого подсчитываем время их разрушения.

var i, n:integer;
a, b,c:array[1..300] of real;
d:array[1..300] of integer;
procedure Sort;
var i, j,y:integer;x:real;
begin
for i:=1 to n do
for j:=i+1 to n do begin
if c[j]>c[i] then begin
x:=c[i];y:=d[i];
c[i]:=c[j];d[i]:=d[j];
c[j]:=x;d[j]:=y;
end;end;
end;
function Time:real;
var uk1,uk2:integer;
t11,t22,t, t1,t2:real;
begin
uk1:=1;uk2:=n;
t1:=0;t2:=0;
while uk1<>uk2 do begin
t11:=t1+A[d[uk1]];
t22:=t2+b[d[uk2]];
if t11<t22 then begin
inc(uk1);t1:=t11;end
else begin dec(uk2);t2:=t22;end;
end;
if t1>t2 then begin
t:=(t1-t2)/b[d[uk1]];
t2:=t1;
end else begin
t:=(t2-t1)/a[d[uk1]];
t1:=t2;
end;
t:=t1+(1-t)/(1/a[d[uk1]]+1/b[d[uk1]]);
Time:=t;
end;
BEGIN
Assign(input,'input. txt');
Reset(input);
Assign(output,'output. txt');
Rewrite(output);
Read(n);
for i:=1 to n do begin
read(a[i],b[i]);
c[i]:=a[i]/b[i];
d[i]:=i;
end;
Sort;
Writeln(Time:0:3);
for i:=1 to n do write(d[i],' ');
END.

Задача 3

Вокруг планеты Зин-зик-буль движется два спутника с постоянными угловыми скоростями. Их положение в двумерном пространстве определяется h часами m минутами.

Требуется написать программу, которая найдет число полных минут до ближайшего момента полного затмения, (положение спутников на одной прямой с планетой).

Технические требования:

Входной файл: INPUT. TXT.

Выходной файл: OUTPUT. TXT.

Ограничение времени: 1 секунда на тест.

Формат входных данных:

Файл INPUT. TXT состоит из одной строки, в которой через пробел записаны два числа h (0 ≤ h ≤ 11) и m (0 ≤ m ≤ 59).

Формат выходных данных:

В выходной файл OUTPUT. TXT вывести единственное целое число - найденное число полных минут.

Пример файлов входных и выходных данных:

INPUT. TXT

OUTPUT. TXT

0 0

0

1 1

4

ОТВЕТ 3

Легко заметить, что в течении одного полного оборота спутников моментов нахождения на одной прямой всего одиннадцать: 0 часов, 0 минут; 1 час, 5 минут и несколько секунд; 2 часа, 10 минут и несколько секунд и т. д. Эти моменты можно получить из простого уравнения 11t=720k, где t– время совпадения в минутах, а k равно последовательно 0, 1, 2, :, 10. По заданному времени (часы, минуты) находим это время в минутах, а после этого ближайшее после него время нахождения на одной прямой. Чтобы избежать дробных чисел будем измерять время не в минутах, а в одну одиннадцатую минуты.

var

h, m, t : integer;

begin

assign(input,'input. txt'); reset(input);

assign(output,'output. txt'); rewrite(output);

read(h, m);

t:=11*(60*h+m) mod 720;

if t<>0 then t:=720-t;

write(t div 11)

end.