Надо решить как можно больше аналитически.
a + a + a = ...a
Это возможно только при a = 0 или a = 5.
k + k + k = ...k при a = 0 или k + k + k + 1 = ...k при a = 5
Эта система имеет решение только при a = 0 и k = 5.
s - это перенос из младшего разряда. Значит s ∈ {1, 2}.
e + 0 + e = ...0 или e + 0 + e + 1 = ...0 или e + 0 + e + 2 = ...0
Такое возможно только при e ∈ {0, 4, 5, 9}. Но 0 и 5 уже заняты. Значит e ∈ {4, 9}.
Получаем
int a = 0;
int k = 5;
for (int s = 1; s <= 2; s++) {
for (int e = 4; e <= 9; e += 5) {
...Тут все остальные буквы.
Такой анализ даст сокращение полного перебора в 2500 раз.
Затем, можно сказать, что d > b > r, соответственно записать циклы как
...
for (int d = 3; d <= 9; d++) {
for (int b = 2; b < d; b++) {
for (int r = 1; r < b; r++) {
...
Это сократит перебор ещё почти в 12 раз (с 1000 циклов до 84)
Для p, с учётом, что из младшего разряда переносится 1, а в старший должна уйти 2, можно записать условие
d + b + p + 1 >= 20 => p >= 19 - d - b
Значит получим цикл
...
for (int p = 19 - d - b; p <= 9; p++) {
...
z можно вообще не оборачивать в цикл, а вычислять как z = (d + b + p + 1) % 10.
Это уменьшит перебор ещё в 10 раз.
Ну и, как правило, в таких задачах есть условие, что разным буквам соответствуют разные цифры. Стоит добавить проверку там, где это необходимо.
Суммарно перебор сократится более, чем в 300000 раз.
Решение на PHP
<?php
$a = 0;
$k = 5;
$count = 0;
for ($s = 1; $s <= 2; $s++) {
for ($e = 4; $e <= 9; $e += 5) {
for ($d = 3; $d <= 9; $d++) {
if ($d == 5 || $d == $e) {
continue;
}
for ($b = 2; $b < $d; $b++) {
if ($b == 5 || $b == $s || $b == $e) {
continue;
}
for ($r = 1; $r < $b; $r++) {
if ($r == 5 || $r == $s || $r == $e) {
continue;
}
for ($p = 19 - $d - $b; $p <= 9; $p++) {
if ($p == 5 || $p == $s || $p == $e ||
$p == $d || $p == $b || $p == $r) {
continue;
}
$z = ($d + $b + $p + 1) % 10;
if ($z == 0 || $z == 5 || $z == $s ||
$z == $e || $z == $d || $z == $b ||
$z == $r || $z == $p) {
continue;
}
$count += 1;
$dedka = $d * 10100 + $e * 1000 + 50;
$babka = $b * 10100 + 50;
$repka = $r * 10000 + $e * 1000 + $p * 100 + 50;
$skazka = $s * 100000 + $z * 100 + 50050;
if ($dedka + $babka + $repka == $skazka) {
print " {$dedka}\n+{$babka}\n+{$repka}\n======\n{$skazka}\n";
}
}
}
}
}
}
}
print "count = {$count}\n";
/*
94950
+80850
+74350
======
250150
count = 17
*/
Фактически, проверка основного условия выполнилась только 17 раз вместо 1000000000 в вашем случае.
P.S. Да, и s можно тоже не перебирать, а вычислять. Тогда будет ещё быстрее, основная проверка выполнится 11 раз.