Задача A. Задача из ЕГЭ Вася готовится к ЕГЭ по информатике и тренируется решать 23 задачу. Он нашел много вариантов этой задачи, но не нашел к ним ответов. Во всех найденных вариантах задачах формулируется
одинаково, отличаются только числа:
Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на k
Первая команда увеличивает число на экране на 1, вторая умножает его на k. Программа для
исполнителя это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число
p, и при этом траектория вычислений содержит число q?
Траектория вычислений программы это последовательность результатов выполнения всех команд программы. Например, для программы 121 при k = 3 траектория будет состоять из чисел 2,
6, 7.
Васе найти правильные ответы.
В первой строке входных данных записано число t количество различных вариантов задачи.
В следующих t строках записаны тройки чисел p, q, k. ответ для каждого варианта выведите в
отдельной строке.
В первом тесте t = 3. Оценка за этот тест: За каждую правильно подсчитанное число
программ начисляется Проверка осуществляется в режиме online (результат виден сразу).
Во втором тесте t = 70. Оценка за этот тест: За каждую правильно подсчитанное число
программ начисляется Во время тура проверяется, что сданный файл содержит 70 чисел.
Проверка правильности ответа осуществляется в режиме oine (результат виден после окончания
тура).
Примеры:
2
20 10 2
20 10 3
ответ на тест:
28
5
using System;
internal class Program {
private static void Main() {
Console.WriteLine("Введите минимум для счетчика");
var min = int.Parse(Console.ReadLine() ?? throw new ());
Console.WriteLine("Введите максимум для счетчика");
var max = int.Parse(Console.ReadLine() ?? throw new ());
Console.WriteLine("Введите значение для счетчика");
var v = int.Parse(Console.ReadLine() ?? throw new ());
var counter = new Counter(max, min, v);
Console.WriteLine("Введите + для увеличение и - для уменьшения, иное для выхода");
do {
var c = Console.ReadKey();
if (c.KeyChar == '+') counter.Increase();
else if (c.KeyChar == '-') counter.Decrease();
else break;
Console.WriteLine($" => {counter.Value}");
} while (true);
Console.ReadKey();
}
}
public class Counter {
public readonly int Maximum;
public readonly int Minimum;
public int Value { private set; get; }
public Counter(int maximum, int minimum, int counter) {
this.Maximum = maximum;
this.Minimum = minimum;
counter = Math.Min(this.Maximum, counter);
counter = Math.Max(this.Minimum, counter);
this.Value = counter;
}
private Counter() {
this.Maximum = 10;
this.Minimum = 0;
this.Value = 5;
}
public void Increase() {
var value = this.Value + 1;
if (value > this.Maximum || value < this.Minimum)
return;
this.Value++;
}
public void Decrease() {
var value = this.Value - 1;
if (value > this.Maximum || value < this.Minimum)
return;
this.Value--;
}
}
Программа на PascalABC
Program 29844007;
uses
GraphABC;
var
XL1,YL1,XR1,YR1:integer; ///координаты первого прямоугольника
XL2,YL2,XR2,YR2:integer; ///координаты второго прямоугольника
XL0,YL0,XR0,YR0:integer; ///координаты результата
s:string; ///строка для вывода результатов;
begin
Window.SetSize(700,700);
writeln('Первый прямоугольник: ');
writeln('Введите X левого нижнего угла ');read(XL1);
writeln('Введите Y левого нижнего угла ');read(YL1);
writeln('Введите X правого верхнего угла ');read(XR1);
writeln('Введите Y правого верхнего угла ');read(YR1);
writeln('Второй прямоугольник: ');
writeln('Введите X левого нижнего угла ');read(XL2);
writeln('Введите Y левого нижнего угла ');read(YL2);
writeln('Введите X правого верхнего угла ');read(XR2);
writeln('Введите Y правого верхнего угла ');read(YR2);
if XL1<XL2 then XL0:=XL1 else XL0:=XL2;
if YL1<YL2 then YL0:=YL1 else YL0:=YL2;
if XR1<XR2 then XR0:=XR2 else XR0:=XR1;
if YR1<YR2 then YR0:=YR2 else YR0:=YR1;
/// Выводим сначала результирующий прямоугольник синим цветом
Brush.Color := clBlue;
Rectangle(XL0,700-YL0,XR0,700-YR0);
/// Рисуем первый прямоугольник красным цветом
Brush.Color := clRed;
Rectangle(XL1,700-YL1,XR1,700-YR1);
/// Выводим второй прямоугольник зелёным
Brush.Color := clGreen;
Rectangle(XL2,700-YL2,XR2,700-YR2);
/// Выводим кординаты
Brush.Color := clWhite;
s:='Координаты левого нижнего угла: '+ IntToStr(XL0)+' '+IntToStr(YL0);
TextOut(0,0,s);
s:='Координаты правого верхнего угла: '+ IntToStr(XR0)+' '+IntToStr(YR0);
TextOut(0,20,s);
end.
Пример вывода на прикреплённом рисунке.