Найдем самое большое и самое маленькое числа в
последовательности. Поделим разность между ними на количество чисел минус один.
Это и будет разностью прогрессии, которая может быть построена из этих чисел.
Если разность прогрессии равна 0, то есть максимальный и минимальный элементы
равны, то тогда такую прогрессию построить можно. В противном случае необходимо
проверить, встречаются ли все элементы арифметической прогрессии ровно по одному
разу в исходной последовательности. Для этого в программе используется байтовый
массив, в котором отмечаются номера встретившихся элементов.
var
n,
m, min, max, h, i, i1, i2 : longint;
a :
array [0..32000] of byte;
b :
array [0..7] of byte;
t :
boolean;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt');
rewrite(output);
b[0]:=1;
b[1]:=2; b[2]:=4; b[3]:=8;
b[4]:=16;
b[5]:=32; b[6]:=64; b[7]:=128;
n:=0;
min:=2147483647; max:=0;
while not eof
do
begin
n:=n+1;
read(m);
if
m<min then min:=m;
if
m>max then max:=m;
end;
if min=max then
write(1) else
begin
h:=(max-min) div (n-1);
max:=(max-min) mod (n-1);
if
max<>0 then write(0) else
begin
for i:=0 to
(n-1) div 8 do a[i]:=0;
reset(input);
t:=true;
while not eof
do
begin
read(m);
i:=(m-min) div h;
t:=t
and ((m-min) mod h = 0);
i1:=i div 8;
i2:=i mod 8;
a[i1]:=a[i1]+b[i2];
end;
if n mod 8
<> 0 then
for
i:=n mod 8 to 7 do a[(n-1) div 8]:=a[(n-1) div
8]+b[i];
for i:=0 to
(n-1) div 8 do t:=t and (a[i]=255);
if t then
write(1) else write(0)
end
end
end.
Работы тестировались на 10
тестах (15 баллов за тесты и 5 премиальных баллов за все пройденные тесты). Эти
тесты (кроме 3 последних, самых больших по объему) можно взять на сайте проекта
http://attend.to/zvn (зеркало - http://krs.fio.ru/olimp).
Одной из целей,
преследуемой при написании этого задачника, было научить учащихся быстро
переключаться между языками программирования и облегчить овладение новыми
языками
программирования.