Предлагаю для начала рассматривать только значения вида (x.. xor x..) Очевидно, скажем, если (x1 xor x2) = 0, то (x3 xor x4) = 1 Так что достаточно посчитать количество цепочек значений xor'ов, где нет двух стоящих подряд 0. Всего пять значений, так что можно посчитать все вручную. Например, составить дерево. Получилось 13 цепочек. Т.к. каждому значению .. xor .. соответствует пара возможных значений x (01 и 10), каждая цепочка будет соответствовать 2^5 = 32 возможным значениям x1..10. Соответственно, ответ: 13 * 32 = 416
// PascalABC.NET 3.0, сборка 1156 от 30.01.2016 begin var n,m:integer; Read(n,m); var a:array[,] of integer; SetLength(a,n,m); for var i:=0 to n-1 do for var j:=0 to m-1 do Read(a[i,j]); var k,r:integer; Read(k,r); var p:=0; //будущий результат foreach var x:integer in a do begin var s:=0; var q:=x; var k1:=0; while q<>0 do begin s:=s+(q mod 10); q:=q div 10; Inc(k1) end; if (k1=k) and (s mod r = 0) then Inc(p) end; Writeln(p) end.
Очевидно, скажем, если (x1 xor x2) = 0, то (x3 xor x4) = 1
Так что достаточно посчитать количество цепочек значений xor'ов, где нет двух стоящих подряд 0. Всего пять значений, так что можно посчитать все вручную. Например, составить дерево.
Получилось 13 цепочек. Т.к. каждому значению .. xor .. соответствует пара возможных значений x (01 и 10), каждая цепочка будет соответствовать 2^5 = 32 возможным значениям x1..10.
Соответственно, ответ: 13 * 32 = 416
begin
var n,m:integer;
Read(n,m);
var a:array[,] of integer;
SetLength(a,n,m);
for var i:=0 to n-1 do
for var j:=0 to m-1 do Read(a[i,j]);
var k,r:integer;
Read(k,r);
var p:=0; //будущий результат
foreach var x:integer in a do begin
var s:=0; var q:=x; var k1:=0;
while q<>0 do begin
s:=s+(q mod 10); q:=q div 10; Inc(k1)
end;
if (k1=k) and (s mod r = 0) then Inc(p)
end;
Writeln(p)
end.
Тестовое решение:
5 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
2 3
5