Как это уменьшить?
program hello;
var a: array of array of array of integer;
p: array of integer;
i, j,t,cnt, sum, w: integer;
m,n,k : integer;
begin
//writeln ('m=');
read (m);
//writeln (' n = ');
read (n);
//writeln ('k=');
read (k);
setlength (p, m+1);
for i: =1 to m do
read (p[i]);
setlength (a, n+1);
for i: =0 to n do
setlength (a[i], m+1);
for i: =0 to n do
for j: =0 to m do
setlength (a[i,j], k+1);
//for j: =1 to p[i]+1);
cnt: =0;
for i: =1 to n do
for j: =1 to m do
for t: =1 to p[j] do
begin
// writeln ('a[',i,j,t,']=');
read (a[i,j,t]);
end;
w: =0;
for i: =n downto 1 do
for j: =1 to m do
begin
cnt: =cnt+1;
sum: =0;
for t: =1 to p[j] do
//writeln (a[i,j,t]);
sum: =sum+(a[i,j,t]);
if sum=0 then begin w: =w+1; end;
end;
writeln (w); cnt: =0;
for i: =n downto 1 do
for j: =1 to m do
begin
cnt: =cnt+1;
sum: =0;
for t: =1 to p[j] do
//writeln (a[i,j,t]);
sum: =sum+(a[i,j,t]);
if sum=0 then begin w: =w+1; writeln (cnt); end;
end;
end.
Рассмотрим, однако, решение, которое позволит делать подобные задачи без прямого подсчёта. Для этого, прежде всего, переведём всё в степени тройки:
98328316+35+35+35−9−32−32==
9
8
+
3
5
−9 =
3
2
8
+
3
5
−
3
2
=
3
16
+
3
5
−
3
2
Как представляется число 3n в троичной системе счисления? Давайте подумаем, как мы переводим из десятичной системы в троичную? Сначала делим на 3, затем частное делим на 3, затем новое частное на 3 и т.п. Что получится в случае деления 3n на 3? Очевидно, что 3n-1. А если его поделить дальше на 3, то получится 3n-2. Если так сделать n раз, то в конце останется 30, то есть. Таким образом, это будет число 100..00, где количество нулей равно n.
То есть, например, 8-ая степени тройки в троичной системе представима в виде 1000000003. А 35 — это 1000003.
Вернёмся теперь к нашей сумме. Давайте сначала в столбик сложим 316 и 35 в троичной системе счисления.
100…000000016100000100…0⏟10100000 1
00
…
0000000
⏞
16
100000 1
00
…
0
⏟
10
100000
Теперь остаётся из этого вычесть 32. Для этого придётся "занять" разряд. Но принцип тут такой же, как и в обычной, десятичной системе счисления, только 0 будут превращаться не в 9, а в 2 (самую большую цифру в троичной системе счисления:
100…0⏞10100000−100100…0⏟10022200 1
00
…
0
⏞
10
100000 −100 1
00
…
0
⏟
10
022200
Таким образом, количество двоек в указанной сумме получилось равным 3.
ответ: 3 двойки в троичной записи.