Понятное дело, что надо считать только суммы изменений
У меня получилась примерно такая формула
Вот пример частного случая (я не предусматривал команду 1) ну и еще может какие-то нюансы не учел
spoiler#include <iostream>
#include <cmath>
using namespace std;
int GCD(int a, int b) { //наибольший делитель
return b ? GCD(b, a%b) : a;
}
int LCM(int a, int b) { //наименьшее кратное
return a / GCD(a, b) * b;
}
int main()
{
int a[4] = { 2, 6, 8, 3};
int k = 0; //счетчик заблокированных
int n = pow(2, 30);
int b = 1;
for (int i = 0; i < 4; i++)
{
k += floor(n/a[i]);
b = -1;
for (int j = 0; j < i; j++)
{
k += floor(n / LCM(a[j], a[i])) *b *2;
b *= -1;
}
}
cout << "otvet " << k;
}
Добавлено:
если поставить 2, 4, 8, 3, а не 2, 3, 4, 8 то будет работать правильно
тут надо еще подумать и доработать знак который ставиться перед 2*(n/НОК(a1,a2))
надо выявить закономерность и правильно указать степень у -1