Задача 6532. Источник: Поляков. Задание КИМ 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
- Строится двоичная запись числа N.
- Если число N делится на 3, в конец двоичной записи дописывается двоичный код числа 3, иначе дописывается единица.
- Если число, полученное после шага 2, делится на 5, в конец двоичной записи дописывается двоичный код числа 5, иначе дописывается единица.
- Полученная таким образом запись является двоичной записью искомого числа R.
Например, для исходного числа 710 = 1112 (не делится на 3) после шага 2 получается число 11112 = 1510 (делится на 5), а после шага 3 – число 11111012 = 12510. Определите наибольшее возможное значение N, для которого в результате работы алгоритма получается R < 106.
Решение
В данной задаче к числу добавляется, как минимум, два единичных разряда, т.е. происходит увеличение не менее чем в 4 раза. Поэтому не имеет смысла анализировать n больше 250000. Задача одинаково легко решается через строки и эквивалентные целочисленные операции.
Python через целочисленные операции
mx = 0
for n in range(1, 250000):
r = n
if r % 3 == 0:
r = r * 4 + 3
else:
r = r * 2 + 1
if r % 5 == 0:
r = r * 8 + 5
else:
r = r * 2 + 1
if r < 1000000:
mx = n
print(mx)
Python через строки
mx = 0
for n in range(1, 250000):
s = bin(n)[2:]
if n % 3 == 0:
s += '11'
else:
s += '1'
if int(s, 2) % 5 == 0:
s += '101'
else:
s += '1'
if int(s, 2) < 1000000:
mx = n
print(mx)
PascalABC через целочисленные операции
var
n, r, max: Integer;
begin
max := 0;
for n := 1 to 249999 do
begin
r := n;
if r mod 3 = 0 then
r := r * 4 + 3
else
r := r * 2 + 1;
if r mod 5 = 0 then
r := r * 8 + 5
else
r := r * 2 + 1;
if r < 1000000 then
max := n;
end;
Writeln(max);
end.
PascalABC через строки
function Bin(n: Integer): String;
begin
result := '';
while n > 0 do
begin
result := IntToStr((n mod 2)) + result;
n := n div 2;
end;
if result = '' then
result := '0';
end;
function Int(s: String; r: Integer := 10): Integer;
var
n, i: Integer;
begin
result := 0;
n := 1;
for i := s.Length downto 1 do
begin
result := result + StrToInt(s[i]) * n;
n := n * r;
end;
end;
var
n, max: Integer;
s: String;
begin
max := 0;
for n := 1 to 249999 do
begin
s := Bin(n);
if n mod 3 = 0 then
s := s + '11'
else
s := s + '1';
if Int(s, 2) mod 5 = 0 then
s := s + '101'
else
s := s + '1';
if Int(s, 2) < 1000000 then
max := n;
end;
Writeln(max);
end.
C++ через целочисленные операции
#include <iostream>
using namespace std;
int main()
{
int max = 0;
for (int n = 1; n < 250000; n++)
{
int r = n;
if (r % 3 == 0)
r = r * 4 + 3;
else
r = r * 2 + 1;
if (r % 5 == 0)
r = r * 8 + 5;
else
r = r * 2 + 1;
if (r < 1000000)
max = n;
}
cout << max << endl;
}
C++ через строки
#include <iostream>
#include <string>
using namespace std;
string bin(int n)
{
string s = "";
while (n > 0)
{
s = to_string(n % 2) + s;
n /= 2;
}
if (s == "")
s = "0";
return s;
}
int to_int(string s, int r)
{
int n = 0, z = 1;
for (int i = s.length() - 1; i >= 0; i--)
{
n += ((int)s[i] - 48) * z;
z *= r;
}
return n;
}
int main()
{
int max = 0;
for (int n = 1; n < 250000; n++)
{
string s = bin(n);
if (n % 3 == 0)
s += "11";
else
s += "1";
if (to_int(s, 2) % 5 == 0)
s += "101";
else
s += "1";
if (to_int(s, 2) < 1000000)
max = n;
}
cout << max << endl;
}
Ответ
249998