Чему равен x, если все запросы выполнялись практически одновременно, т. е. во время выполнения запросов набор страницы, содержащих все искомые слова, не изменился , умоляю
const n = 5; m = 10; {кол-во столбцов} l = 10; {максимальная длина одной строки/слова} {letters = '';} file_path = 'data.txt';
type SmallString = string[l]; WordsMas = array[1..n, 1..m] of SmallString;
var words: WordsMas; i, j, k: integer;
function RandomWord(n: integer): SmallString; var i: integer; s: SmallString; letters: string; begin letters := ''; s := ''; for i := 1 to n do s := s + letters[Random(length(letters) - 1) + 1]; RandomWord := s; end;
function Replace(s, find_text, replace_text: SmallString): SmallString; var i: integer; begin repeat i := pos(find_text, s); if i <> 0 then begin delete(s, i, length(find_text)); insert(replace_text, s, i); end; until i = 0;
Replace := s; end;
function Invert(s: SmallString): SmallString; var i: integer; t: SmallString; begin t := ''; for i := 1 to length(s) do t := s[i] + t;
Invert := t; end;
function SwapCase(s: SmallString): SmallString; var i: integer; begin for i := 1 to length(s) do if s[i] = upcase(s[i]) then s[i] := chr(ord(s[i]) + 32) else s[i] := upcase(s[i]);
SwapCase := s; end;
procedure PrintMas(mas: WordsMas; name: string); var i, j: integer; f: text; begin writeln(name); for i := 1 to n do begin
write(i, ': '); for j := 1 to m do write(mas[i, j]:l, '; '); writeln; end;
Assign(f, file_path); Append(f);
writeln(f, name); for i := 1 to n do begin
write(f, i, ': '); for j := 1 to m do write(f, mas[i, j]:l, '; '); writeln(f); end;
Close(f); end;
begin Randomize; ClrScr;
for i := 1 to n do for j := 1 to m do words[i, j] := RandomWord(Random(l - 5) + 5); {words[i, j] := 'GoodXXMMNN';}
PrintMas(words, 'Original');
for i := 1 to n do for j := 1 to m do case i of 1: words[i, j] := Replace(words[i, j], 'N', 'X'); 2: words[i, j] := Replace(words[i, j], 'X', 'M'); 3: words[i, j] := Invert(words[i, j]); 4: words[i, j] := SwapCase(words[i, j]); end;
Первое уравнение системы – это несколько условий, соединённых конъюнкциями. Чтобы такая последовательность условий была истинной, каждое условие должно быть истинным. Заметим, что если какой-то икс оказался равен 1, то все последующие иксы тоже должны быть равны нулю, так как 1 -> 0 = 0.
Остальные уравнения имеют одинаковый вид (a ∨ b ∨ ~c) ∧ (a ∨ ~b ∨ c) ∧ (~a ∨ b ∨ c) = 1. Вновь каждая скобка должна быть истинной. Прикинем, когда так будет.
Пусть a = 1. При этом первые две скобки автоматически истинны, а третья превращается в b ∨ c, что будет истинно, если хотя бы одна из переменных b, c истинна. В этом случае есть 3 комбинации (b, c), при которых уравнение выполняется (все, кроме 0, 0).
Если a = 0, то истинна третья скобка, первые две превращаются в (b ∨ ~c) ∧ (~b ∨ c). В таком выражении можно разглядеть (c -> b) ∧ (b -> c), т.е. эквиваленцию b ↔ c. Она верна, только если операнды одинаковы, тогда есть две комбинации (b, c), при которых уравнение выполняется: (0, 0) и (1, 1).
Собираем вместе: решение первого уравнения – первые k иксов равны 0, оставшиеся 7 - k иксов равны 1. Все оставшиеся уравнения зависимы только через иксы, если соответствующий икс равен 0, то такое уравнение имеет 2 решения, иначе 3 решения. По правилу произведения система при фиксированном k имеет 2^k * 3^(7 - k) = 3^7 * (2/3)^k решений.
Чтобы найти общее количество решений, нужно просуммировать при k от 0 до 7. В этом сумма геометрической прогрессии:
const
n = 5;
m = 10; {кол-во столбцов}
l = 10; {максимальная длина одной строки/слова}
{letters = '';}
file_path = 'data.txt';
type
SmallString = string[l];
WordsMas = array[1..n, 1..m] of SmallString;
var
words: WordsMas;
i, j, k: integer;
function RandomWord(n: integer): SmallString;
var
i: integer;
s: SmallString;
letters: string;
begin
letters := '';
s := '';
for i := 1 to n do
s := s + letters[Random(length(letters) - 1) + 1];
RandomWord := s;
end;
function Replace(s, find_text, replace_text: SmallString): SmallString;
var
i: integer;
begin
repeat
i := pos(find_text, s);
if i <> 0 then begin
delete(s, i, length(find_text));
insert(replace_text, s, i);
end;
until i = 0;
Replace := s;
end;
function Invert(s: SmallString): SmallString;
var
i: integer;
t: SmallString;
begin
t := '';
for i := 1 to length(s) do
t := s[i] + t;
Invert := t;
end;
function SwapCase(s: SmallString): SmallString;
var
i: integer;
begin
for i := 1 to length(s) do
if s[i] = upcase(s[i]) then
s[i] := chr(ord(s[i]) + 32)
else s[i] := upcase(s[i]);
SwapCase := s;
end;
procedure PrintMas(mas: WordsMas; name: string);
var
i, j: integer;
f: text;
begin
writeln(name);
for i := 1 to n do
begin
write(i, ': ');
for j := 1 to m do
write(mas[i, j]:l, '; ');
writeln;
end;
Assign(f, file_path);
Append(f);
writeln(f, name);
for i := 1 to n do
begin
write(f, i, ': ');
for j := 1 to m do
write(f, mas[i, j]:l, '; ');
writeln(f);
end;
Close(f);
end;
begin
Randomize;
ClrScr;
for i := 1 to n do
for j := 1 to m do
words[i, j] := RandomWord(Random(l - 5) + 5);
{words[i, j] := 'GoodXXMMNN';}
PrintMas(words, 'Original');
for i := 1 to n do
for j := 1 to m do
case i of
1: words[i, j] := Replace(words[i, j], 'N', 'X');
2: words[i, j] := Replace(words[i, j], 'X', 'M');
3: words[i, j] := Invert(words[i, j]);
4: words[i, j] := SwapCase(words[i, j]);
end;
PrintMas(words, 'New One');
Readln;
end.
Проверялось. Работает на Турбо паскале
Первое уравнение системы – это несколько условий, соединённых конъюнкциями. Чтобы такая последовательность условий была истинной, каждое условие должно быть истинным. Заметим, что если какой-то икс оказался равен 1, то все последующие иксы тоже должны быть равны нулю, так как 1 -> 0 = 0.
Остальные уравнения имеют одинаковый вид (a ∨ b ∨ ~c) ∧ (a ∨ ~b ∨ c) ∧ (~a ∨ b ∨ c) = 1. Вновь каждая скобка должна быть истинной. Прикинем, когда так будет.
Пусть a = 1. При этом первые две скобки автоматически истинны, а третья превращается в b ∨ c, что будет истинно, если хотя бы одна из переменных b, c истинна. В этом случае есть 3 комбинации (b, c), при которых уравнение выполняется (все, кроме 0, 0).
Если a = 0, то истинна третья скобка, первые две превращаются в (b ∨ ~c) ∧ (~b ∨ c). В таком выражении можно разглядеть (c -> b) ∧ (b -> c), т.е. эквиваленцию b ↔ c. Она верна, только если операнды одинаковы, тогда есть две комбинации (b, c), при которых уравнение выполняется: (0, 0) и (1, 1).
Собираем вместе: решение первого уравнения – первые k иксов равны 0, оставшиеся 7 - k иксов равны 1. Все оставшиеся уравнения зависимы только через иксы, если соответствующий икс равен 0, то такое уравнение имеет 2 решения, иначе 3 решения. По правилу произведения система при фиксированном k имеет 2^k * 3^(7 - k) = 3^7 * (2/3)^k решений.
Чтобы найти общее количество решений, нужно просуммировать при k от 0 до 7. В этом сумма геометрической прогрессии:
3^7 * ((2/3)^0 + (2/3)^1 + ... + (2/3)^7) = 3^7 * (1 - (2/3)^8)/(1 - 2/3) = 3^8 - 2^8 = 6305.