Задания
Версия для печати и копирования в MS Word
Тип 5 № 75242
i

Ал­го­ритм по­лу­ча­ет на вход на­ту­раль­ное число N и стро­ит по нему новое число R сле­ду­ю­щим об­ра­зом.

1.  Стро­ит­ся тро­ич­ная за­пись числа N.

2.  В по­лу­чен­ной за­пи­си все нули за­ме­ня­ют­ся на двой­ки, все двой­ки  — на нули. Из по­лу­чен­но­го числа уда­ля­ют­ся ве­ду­щие нули.

3.  Ре­зуль­тат пе­ре­во­дит­ся в де­ся­тич­ную си­сте­му счис­ле­ния.

4.  Ре­зуль­та­том ра­бо­ты ал­го­рит­ма ста­но­вит­ся мо­дуль раз­но­сти ис­ход­но­го числа N и числа, по­лу­чен­но­го на преды­ду­щем шаге.

 

При­мер. Дано число N  =  35. Ал­го­ритм ра­бо­та­ет сле­ду­ю­щим об­ра­зом.

1.  Стро­им тро­ич­ную за­пись числа N: 3510  =  10223.

2.  За­ме­ня­ем цифры и уда­ля­ем ве­ду­щие нули: 1022 → 1200.

3.  Пе­ре­во­дим в де­ся­тич­ную си­сте­му: 12003  =  4510.

4.  Вы­чис­ля­ем мо­дуль раз­но­сти: |35 − 45|  =  10.

Ре­зуль­тат ра­бо­ты ал­го­рит­ма R  =  10.

При каком наи­мень­шем N в ре­зуль­та­те ра­бо­ты ал­го­рит­ма по­лу­чит­ся R  =  1 864 246.

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние за­да­чи на языке Python.

for N in range(1864245, 10**10):

s = ''

while N > 0:

s += str(N%3)

N //= 3

s = s[::-1]

R = s.replace('0','*').replace('2','0').replace('*','2')

if abs(int(s,3) - int(R,3)) == 1864246:

print(int(s,3))

break

 

 

Ответ: 3323607.

 

При­ведём про­грам­му Сер­гея Донец на PascalABC.NET:

При малых N раз­ность R = |M - N| также мала (как в при­ме­ре с N = 35 → R = 10).

M по­лу­ча­ет­ся за­ме­ной цифр в тро­ич­ной за­пи­си N, по­это­му M и N имеют со­по­ста­ви­мый по­ря­док ве­ли­чи­ны.

R растёт про­пор­ци­о­наль­но N, но не­ли­ней­но из-за за­ме­ны цифр в тро­ич­ной си­сте­ме.

Если N∼103 то R∼103.

Если N∼106 то R∼106.

Сле­до­ва­тель­но, R=∣M−N∣ также имеет по­ря­док, близ­кий к N.

При за­ме­не всех 0 на 2 в тро­ич­ной за­пи­си N, число M может уве­ли­чить­ся мак­си­мум в 2 раза

если N = R = 1864246 div 2, то N = 932123 M = 662199 R = 269924 под­твер­жда­ет­ся про­пор­ци­о­наль­ность ∼103

чтобы не вы­счи­ты­вать оп­ти­маль­ное на­ча­ло N при­мем N = R = 1864246 и для него вы­счи­та­ем раз­ность:

N = 1864246. по­лу­чим M = 2918722 R = 1054476 (мень­ше тре­бу­е­мо­го почти в 2 раза), зна­чит

N > 1864246. также под­твер­жда­ет­ся пра­пор­ци­о­наль­ность ∼106

Если N<1864246, то M (по­лу­чен­ное за­ме­ной цифр) не может быть боль­ше N+1864246, так как за­ме­на цифр в тро­ич­ной си­сте­ме не при­во­дит к та­ко­му скач­ку. Сле­до­ва­тель­но, R=∣M−N∣ не может до­стичь 1864246 при N<1864246.

Пе­ре­бор можно на­чи­нать и с N = 1, но оп­ти­маль­нее  — с N = R = 1864246, так как при N<1864246 раз­ность за­ве­до­мо мень­ше це­ле­во­го зна­че­ния.

мы и так уже съэко­но­ми­ли диа­па­зон 1..1864246. На­чи­на­ем пе­ре­бор с N=1864246.

Обос­но­ва­ние ниж­ней гра­ни­цы по­ис­ка

Если N<1864246, то R за­ве­до­мо мень­ше це­ле­во­го зна­че­ния, так как R≤N<1864246.

Сле­до­ва­тель­но, пе­ре­бор можно на­чи­нать с N=1864246 (это эко­но­мит диа­па­зон 1..1864246).

Оп­ти­ми­за­ция верх­ней гра­ни­цы

Верх­няя гра­ни­ца: N≤2×1864246=3728492 (так как M≤2N, и R=M−N≤N).

Ито­го­вый диа­па­зон пе­ре­бо­ра: N∈[1864246,3728492].

 

 

uses School;

begin

var start := 1864246;

var koend := 1864246 * 2;

var minN := MaxInt; // Ини­ци­а­ли­за­ция мак­си­маль­ным зна­че­ни­ем

for var n := start to koend do

begin

var T := ToBase(n, 3);// N в тро­ич­ной си­сте­ме

T := T.Translate('02', '20'); // За­ме­на 0→2, 2→0

var M := dec(t, 3);// M = пре­об­ра­зо­ван­ное число

var R := abs(M - N);// R = |M - N|

if R = 1864246 then

begin

minN := N < minN ? N : minN;// Об­нов­ля­ем ми­ни­маль­ное N

//Println(N, M, R);         // Вывод для от­лад­ки = в окон­ча­тель­ном ва­ри­ан­те за­ко­мен­ти­ру­ем

end;

end;

Println(minN); // Ми­ни­маль­ное N, да­ю­щее R = 1864246

end.


Аналоги к заданию № 75242: 75269 Все