Заводим переменную [latex]result[/latex] и присваиваем ей значение 0 . Далее, в цикле от 0 до [latex]n[/latex] увеличиваем значение текущего значения [latex]result[/latex]. По окончании цикла возводим [latex]result[/latex] в квадрат и умножаем на 2.
В некотором учебном заведении функционирует кружок хорового пения. Начало кружка всегда происходит единообразно: по сигналу руководителя кружка все [latex]N[/latex] участников становятся в круг и каждый [latex]M[/latex]-й для распевки поёт гамму.
Руководитель кружка заметил, что размять голосовые связки не всегда удаётся всем участникам кружка. По заданным [latex]M[/latex] и[latex]N[/latex] помогите ему определить, или в очередной раз в разминке примут участие все участники хора.
Входные данные
Входные данные состоят из нескольких тестовых случаев. Каждый тестовый случай расположен в отдельной строке и содержит два целых числа [latex]M[/latex] и [latex]N[/latex].
Выходные данные
Для каждого тестового случая в отдельной строке выведите «Yes», если в разминке примут участие все участники хора, в противном случае выведите «No».
Тесты:
n
m
answer
4
1
Yes
6
3
No
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
classMain
{
staticfunctionmain()
{
varn,m,p;
n=getNextInt();
while((m=getNextInt())>0)
{
while((p=n%m)!=0)
{
n=m;
m=p;
}
varresult=m==1?"Yes":"No";
varoutput=Sys.stdout();
output.writeString(result+"\n");
}
}
staticfunctiongetNextInt()
{
varnumber=Sys.stdin().readLine();
returnStd.parseInt(number);
}
}
Ход решения:
Для начала нам надо найти наибольший общий делитель (НОД). Для этого хорошо подойдет алгоритм Евклида и если НОД равен единице, то все ученики распоются и на выходе подаётся «Yes», иначе «No».
Для нумерации $M$ страниц книги использовали $N$ цифр. По заданному $N$ вывести $M$ или $0$, если решения не существует. Нумерация начинается с первой страницы.
Входные данные
Единственное число $N$. В книге не более $1001$ страницы.
Выходные данные
Искомое количество страниц.
Тесты :
$N$
$8$
$21$
$22$
$113$
$999$
$1001$
$M$
$8$
$15$
$0$
$61$
$369$
$0$
Код на Haxe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
classTest{
publicvarn:Int;
publicfunctionnew(n){
this.n=n;
}
staticfunctionmain(){
vartests=newArray();
tests.push(newTest(8));
tests.push(newTest(21));
tests.push(newTest(22));
tests.push(newTest(113));
tests.push(newTest(999));
tests.push(newTest(1001));
vari:Test;
for(iintests){
varn:Int=i.n;
varm:Int=0;
while(n>0){
m++;
if(m<10){//1 digit
n-=1;
}elseif(m<100){//2 digits
n-=2;
}elseif(m<1000){//3 digits
n-=3;
}else{//4 digits
n-=4;
}
if(n<0){
m=0;
}
}
trace(m);
}
}
}
Ход решения:
Принимаем исходное количество страниц $M$ как $0$ и увеличиваем его в начале каждой итерации цикла. Цикл будет идти, пока мы не исчерпаем заданное количество цифр $N$, вычитаем необходимое их количество в зависимости от $M$:
19
20
21
22
23
24
25
26
27
28
29
30
varm:Int=0;
while(n>0){
m++;
if(m<10){//1 digit
n-=1;
}elseif(m<100){//2 digits
n-=2;
}elseif(m<1000){//3 digits
n-=3;
}else{//4 digits
n-=4;
}
Далее проверяем условие корректности исходных данных: если мы получили отрицательное значение $N$, значит, исходное его значение также было неверным, тогда количеству страниц присваиваем $0$:
31
32
33
if(n<0){
m=0;
}
Выйдя из цикла, выводим $M$:
35
trace(m);
Примечание: Входные данные для тестирования были заданы программно из-за определенных затруднений в использовании стандартного ввода в онлайн-среде try.haxe.org.
Ссылки:
Рабочий код для тестирования на try.haxe.org: Try Haxe !
Вычислить бесконечную сумму с заданной точностью $ \varepsilon \left(\varepsilon > 0\right) $. Считать, что требуемая точность достигнута, если очередное слагаемое оказалось по модулю меньше, чем $ \varepsilon $.
$$\sum_{i = 1}^\infty \frac{1}{i ^ 2}$$
Входные данные
Точность $ \varepsilon $.
Выходные данные
Бесконечная сумма с заданной точностью $ \varepsilon $.
На каждом шаге текущее слагаемое равно $ \frac{1}{i^2} $. Пока оно не меньше заданной точности, прибавляем к ответу.
Если заданная точность отрицательна либо равна нулю, цикл станет бесконечным, потому что $ \frac{1}{i^2} > 0, \forall i > 0 $.
Реальная же сумма ряда равна $\frac{\pi^2}{6}$, что в десятичном приближении представляет собой число 1.64493406684822643647241516664602518921894990120679843773555…
Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.
Входные данные.
Начальное и конечное время одних календарных суток в часах ($H$) и минутах ($M$) через пробел ([latex]0 \leq H \leq 23, 0 \leq M \leq 59[/latex]).
Выходные данные.
Ответ на задачу.
Тесты
Входные данные
Выходные данные
Начальное и конечное время
Количество ударов
13 30 15 10
7
0 00 23 59
180
12 30 12 30
1
22 22 22 25
0
Код.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
classTest{
staticfunctionmain(){
varoutput=Sys.stdout();
varh1:Int=Std.parseInt(Sys.stdin().readLine());
varm1:Int=Std.parseInt(Sys.stdin().readLine());
varh2:Int=Std.parseInt(Sys.stdin().readLine());
varm2:Int=Std.parseInt(Sys.stdin().readLine());
varres:Int=0;
while((h2*60+m2)-(h1*60+m1)>=0)
{
if(m1==59)
{
h1++;
m1=0;
}
if(m1==30)
{
res++;
}
if(m1==0)
{
res+=h1%12;
}
m1++;
}
output.writeString(res);
}
}
Решение.
Заведем переменную, которая будет отвечать за количество пробитых ударов
res. Если на часах 59 минут, то увеличиваем количество часов
h1, и обнуляем значение минутной стрелки
m1, для следующего круга. Если значение минутной стрелки равно 30 то увеличиваем переменную
res на один. Если же минутная стрелка на 12, то есть 0 минут, то к
res добавляем остаток от деления текущего количества часов на 12. Увеличиваем значение переменной
m1 на 1. Повторяем, пока начальное время не будет совпадать с конечным.
Ссылка на решение задачи на сайте Try Haxe!
Альтернативное решение.
Также существует способ решения этой задачи без использования циклов. Для этого я использовала функцию
FactTree, которая реализует арифметическую прогрессию. Эта функция считает сколько ударов совершили часы от 0 часов, до указанного в качестве параметра времени. Объясним принцип работы функции
ProdTree.Пусть нам нужно найти сумму последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) + P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что слагаемые будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух слагаемых. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L + R, если L и R отличаются на единицу.