Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Али говорит, что он не знает загаданных чисел. Отсюда можно сделать вывод, что хотя бы одно из загаданных чисел не простое, иначе число раскладывалось бы на множители единственным способом.
Оказывается, в диапазоне от 1 до 100 существует всего четыре пары чисел, которые бы мог загадать шейх. Иными словами, мудрецам неслабо фартануло :)
77 * 96 = 7392 x: 88; y: 84 (88 + 84) = 172 inVali's numbers:true x: 96; y: 77 (96 + 77) = 173 inVali's numbers:false x: 112; y: 66 (112 + 66) = 178 inVali's numbers:false x: 132; y: 56 (132 + 56) = 188 inVali's numbers:true x: 154; y: 48 (154 + 48) = 202 inVali's numbers:false x: 168; y: 44 (168 + 44) = 212 inVali's numbers:true x: 176; y: 42 (176 + 42) = 218 inVali's numbers:false x: 224; y: 33 (224 + 33) = 257 inVali's numbers:false x: 231; y: 32 (231 + 32) = 263 inVali's numbers:false x: 264; y: 28 (264 + 28) = 292 inVali's numbers:true x: 308; y: 24 (308 + 24) = 332 inVali's numbers:true x: 336; y: 22 (336 + 22) = 358 inVali's numbers:false x: 352; y: 21 (352 + 21) = 373 inVali's numbers:false x: 462; y: 16 (462 + 16) = 478 inVali's numbers:false x: 528; y: 14 (528 + 14) = 542 inVali's numbers:false x: 616; y: 12 (616 + 12) = 628 inVali's numbers:true x: 672; y: 11 (672 + 11) = 683 inVali's numbers:false x: 924; y: 8 (924 + 8) = 932 inVali's numbers:true x: 1056; y: 7 (1056 + 7) = 1063 inVali's numbers:false x: 1232; y: 6 (1232 + 6) = 1238 inVali's numbers:false x: 1848; y: 4 (1848 + 4) = 1852 inVali's numbers:true x: 2464; y: 3 (2464 + 3) = 2467 inVali's numbers:false x: 3696; y: 2 (3696 + 2) = 3698 inVali's numbers:true 80 * 99 = 7920 x: 90; y: 88 (90 + 88) = 178 inVali's numbers:false x: 99; y: 80 (99 + 80) = 179 inVali's numbers:false x: 110; y: 72 (110 + 72) = 182 inVali's numbers:false x: 120; y: 66 (120 + 66) = 186 inVali's numbers:false x: 132; y: 60 (132 + 60) = 192 inVali's numbers:true x: 144; y: 55 (144 + 55) = 199 inVali's numbers:false x: 165; y: 48 (165 + 48) = 213 inVali's numbers:false x: 176; y: 45 (176 + 45) = 221 inVali's numbers:false x: 180; y: 44 (180 + 44) = 224 inVali's numbers:false x: 198; y: 40 (198 + 40) = 238 inVali's numbers:false x: 220; y: 36 (220 + 36) = 256 inVali's numbers:false x: 240; y: 33 (240 + 33) = 273 inVali's numbers:false x: 264; y: 30 (264 + 30) = 294 inVali's numbers:false x: 330; y: 24 (330 + 24) = 354 inVali's numbers:false x: 360; y: 22 (360 + 22) = 382 inVali's numbers:false x: 396; y: 20 (396 + 20) = 416 inVali's numbers:false x: 440; y: 18 (440 + 18) = 458 inVali's numbers:false x: 495; y: 16 (495 + 16) = 511 inVali's numbers:false x: 528; y: 15 (528 + 15) = 543 inVali's numbers:false x: 660; y: 12 (660 + 12) = 672 inVali's numbers:false x: 720; y: 11 (720 + 11) = 731 inVali's numbers:false x: 792; y: 10 (792 + 10) = 802 inVali's numbers:false x: 880; y: 9 (880 + 9) = 889 inVali's numbers:false x: 990; y: 8 (990 + 8) = 998 inVali's numbers:false x: 1320; y: 6 (1320 + 6) = 1326 inVali's numbers:false x: 1584; y: 5 (1584 + 5) = 1589 inVali's numbers:false x: 1980; y: 4 (1980 + 4) = 1984 inVali's numbers:true x: 2640; y: 3 (2640 + 3) = 2643 inVali's numbers:false x: 3960; y: 2 (3960 + 2) = 3962 inVali's numbers:false
И мудрецы сообщили пораженному царю задуманные им числа.
Иными словами, мудрецам неслабо фартануло :)
#!/usr/bin/perl
use strict;
use warnings;
# Usage: perl solution.pl [MAX_NUM]
# (default for MAX_NUM is 99)
my $max_num = ($ARGV[0] || 99);
my $DEBUG = 0;
# Possible values Ali (muls) and Vali (sums) have (as we know it)
# Key - sum/mul, value - possible pairs for this sum/mul
my %sums = ();
my %muls = ();
# Search for an element in the array and delete it
sub del_array_elem($$) {
my ($arr, $elem) = @_;
for (my $i = 0; $i < scalar(@$arr); ++$i) {
if ($arr->[$i] eq $elem) {
splice(@$arr, $i, 1);
return;
}
}
}
# Dump current possible values
sub dmp($;$) {
my ($prefix, $force) = @_;
return if (!$DEBUG && !$force);
print "$prefix\nPossible muls:\n";
for my $i (sort { $a <=> $b } keys(%muls)) {
print $i . '(' . join(',', @{$muls{$i}}) . ")\n";
}
print "\n";
print "Possible sums:\n";
for my $i (sort { $a <=> $b } keys(%sums)) {
print $i . '(' . join(',', @{$sums{$i}}) . ")\n";
}
print "\n\n";
}
# Initially, no information - all pairs are possible
for (my $i = 2; $i <= $max_num; ++$i) {
for (my $j = $i; $j <= $max_num; ++$j) {
$sums{$i + $j} = [] if (!$sums{$i + $j});
push(@{$sums{$i + $j}}, $i . '+' . $j);
$muls{$i * $j} = [] if (!$muls{$i * $j});
push(@{$muls{$i * $j}}, $i . '*' . $j);
}
}
dmp('Initial:');
# Ali does not know x,y => mul is not a unique multiplication
# And Vali knows this beforehand => sum is not sum of such a pair
my @del_muls_from_sum = ();
for (my $i = 2; $i <= $max_num; ++$i) {
for (my $j = $i; $j <= $max_num; ++$j) {
if (scalar(@{$muls{$i * $j}}) == 1) {
delete $muls{$i * $j};
if ($sums{$i + $j}) {
# Since we remove sum-values, we should also eliminate respective muls
push @del_muls_from_sum, @{$sums{$i + $j}};
delete $sums{$i + $j};
}
}
}
}
dmp('No mul-unique pairs:');
print "\nTo delete: " . join(', ', @del_muls_from_sum) . "\n\n" if ($DEBUG);
for my $sum (@del_muls_from_sum) {
$sum =~ m/^(\d+)\+(\d+)$/ or die "Invalid format of '$sum'";
my $i = $1;
my $j = $2;
if ($muls{$i * $j}) {
del_array_elem($muls{$i * $j}, $i . '*' . $j);
if (scalar(@{$muls{$i * $j}}) == 0) {
delete $muls{$i * $j};
}
}
}
@del_muls_from_sum = ();
dmp('Stage 2:');
# At this stage Ali knows the numbers => mul is a unique.
# Remove all non-unique muls and leave only respective sums.
my %restsums = ();
for (my $i = 2; $i <= $max_num; ++$i) {
for (my $j = $i; $j <= $max_num; ++$j) {
if ($muls{$i * $j}) {
if (scalar(@{$muls{$i * $j}}) > 1) {
delete $muls{$i * $j};
}
elsif (scalar(@{$muls{$i * $j}}) == 1) {
if ($sums{$i + $j}) {
$restsums{$i + $j} = [] if (!$restsums{$i + $j});
push(@{$restsums{$i + $j}}, $i . '+' . $j);
}
}
}
}
}
%sums = %restsums;
dmp('Unique muls:');
# Vali also knows numbers => sum is a unique.
# Remove all non-unique sums and leave only respective muls.
my %restmuls = ();
for (my $i = 2; $i <= $max_num; ++$i) {
for (my $j = $i; $j <= $max_num; ++$j) {
if ($sums{$i + $j}) {
if (scalar(@{$sums{$i + $j}}) > 1) {
delete $sums{$i + $j};
}
elsif (scalar(@{$sums{$i + $j}}) == 1) {
if ($muls{$i * $j}) {
$restmuls{$i * $j} = [] if (!$restmuls{$i * $j});
push(@{$restmuls{$i * $j}}, $i . '*' . $j);
}
}
}
}
}
%muls = %restmuls;
dmp('Final solutions:', 1);
nMax = 62
+ a = 4; b = 13; sum = 17; mul = 52
Count = 1
nMax = 866
a = 4; b = 13; sum = 17; mul = 52
+ a = 4; b = 61; sum = 65; mul = 244
Count = 2
nMax = 1502
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
+ a = 32; b = 131; sum = 163; mul = 4192
Count = 3
nMax = 1966
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
+ a = 16; b = 73; sum = 89; mul = 1168
a = 32; b = 131; sum = 163; mul = 4192
Count = 4
nMax = 2518
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
+ a = 16; b = 111; sum = 127; mul = 1776
a = 32; b = 131; sum = 163; mul = 4192
Count = 5
nMax = 3826
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 32; b = 131; sum = 163; mul = 4192
+ a = 32; b = 311; sum = 343; mul = 9952
Count = 6
nMax = 4034
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
+ a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 32; b = 311; sum = 343; mul = 9952
Count = 7
nMax = 4622
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
+ a = 4; b = 229; sum = 233; mul = 916
a = 32; b = 311; sum = 343; mul = 9952
+ a = 64; b = 309; sum = 373; mul = 19776
Count = 9
nMax = 4714
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
+ a = 67; b = 82; sum = 149; mul = 5494
a = 32; b = 131; sum = 163; mul = 4192
a = 4; b = 229; sum = 233; mul = 916
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 10
nMax = 5482
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
-
a = 32; b = 131; sum = 163; mul = 4192
a = 4; b = 229; sum = 233; mul = 916
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 9
nMax = 7778
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 4; b = 229; sum = 233; mul = 916
+ a = 8; b = 239; sum = 247; mul = 1912
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 10
nMax = 7894
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
+ a = 4; b = 181; sum = 185; mul = 724
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 11
nMax = 7934
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
+ a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 12
nMax = 9098
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
+ a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 13
nMax = 10966
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
+ a = 139; b = 192; sum = 331; mul = 26688
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 14
nMax = 12346
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 139; b = 192; sum = 331; mul = 26688
+ a = 149; b = 188; sum = 337; mul = 28012
a = 32; b = 311; sum = 343; mul = 9952
a = 64; b = 309; sum = 373; mul = 19776
Count = 15
nMax = 13162
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 139; b = 192; sum = 331; mul = 26688
a = 149; b = 188; sum = 337; mul = 28012
a = 32; b = 311; sum = 343; mul = 9952
-
Count = 14
nMax = 14002
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 139; b = 192; sum = 331; mul = 26688
-
a = 32; b = 311; sum = 343; mul = 9952
Count = 13
nMax = 16178
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 139; b = 192; sum = 331; mul = 26688
a = 32; b = 311; sum = 343; mul = 9952
+ a = 32; b = 821; sum = 853; mul = 26272
Count = 14
nMax = 16466
a = 4; b = 13; sum = 17; mul = 52
a = 4; b = 61; sum = 65; mul = 244
a = 16; b = 73; sum = 89; mul = 1168
a = 16; b = 111; sum = 127; mul = 1776
a = 64; b = 73; sum = 137; mul = 4672
a = 32; b = 131; sum = 163; mul = 4192
a = 16; b = 163; sum = 179; mul = 2608
a = 4; b = 181; sum = 185; mul = 724
a = 64; b = 127; sum = 191; mul = 8128
a = 4; b = 229; sum = 233; mul = 916
a = 8; b = 239; sum = 247; mul = 1912
a = 139; b = 192; sum = 331; mul = 26688
a = 32; b = 311; sum = 343; mul = 9952
+ a = 32; b = 641; sum = 673; mul = 20512
a = 32; b = 821; sum = 853; mul = 26272
Count = 15
Решение задачи о двух мудрецах