Ответы пользователя по тегу Программирование
  • Как решить задачу про блокировку адресов?

    @Tabris17
    Понятное дело, что надо считать только суммы изменений
    У меня получилась примерно такая формула
    5c9cb73b52d7d628553023.jpeg
    Вот пример частного случая (я не предусматривал команду 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
    Ответ написан
    2 комментария