М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
qofepvcqj
qofepvcqj
27.04.2022 00:32 •  Информатика

Умножение многочленов алгоритмом Карацубы
КОД НА С++
НЕ ПЫТАЙТЕСЬ ПИСАТЬ БРЕД

👇
Ответ:
andrey89160
andrey89160
27.04.2022

ответ:Алгоритм Карацубы — метод быстрого умножения со сложностью вычисления nlog23. В то время, как наивный алгоритм, умножение в столбик, требует n2 операций. Следует заметить, что при длине чисел короче нескольких десятков знаков (точнее определяется экспериментально), быстрее работает обычное умножение.

Представим, что есть два числа A и B длиной n в какой-то системе счисления BASE:

A = an-1an-2...a0

B = bn-1an-2...a0, где a?, b? — значение в соотв. разряде числа.

Каждое из них можно представить в виде суммы их двух частей, половинок длиной m = n / 2 (если n нечетное, то одна часть короче другой на один разряд:

A0 = am-1am-2...a0

A1 = an-1an-2...am

A = A0 + A1 * BASEm

B0 = bm-1bm-2...b0

B1 = bn-1bn-2...bm

B = B0 + B1 * BASEm

Тогда: A * B = ( A0 + A1 * BASEm ) * ( B0 + B1 * BASEm ) = A0 * B0 + A0 * B1 * BASEm + A1 * B0 * BASEm + A1 * B1 * BASE2 * m = A0 * B0 + ( A0 * B1 + A1 * B0 ) * BASEm + A1 * B1 * BASE2 * m

Здесь нужно 4 операции умножения (части формулы * BASE? * m не являются умножением, фактически указывая место записи результата, разряд). Но с другой стороны:

( A0 + A1 ) * ( B0 + B1 ) = A0 * B0 + A0 * B1 + A1 * B0 + A1 * B1

Посмотрев на выделенные части в обоих формулах. После несложных преобразований количество операций умножения можно свести к 3-м, заменив два умножения на одно и несколько операций сложения и вычитания, время выполнения которых на порядок меньше:

A0 * B1 + A1 * B0 = ( A0 + A1 ) * ( B0 + B1 ) — A0 * B0 — A1 * B1

Окончательный вид выражения:

A * B = A0 * B0 + (( A0 + A1 ) * ( B0 + B1 ) — A0 * B0 — A1 * B1 ) * BASEm + A1 * B1 * BASE2 * m

Объяснение:

4,6(13 оценок)
Открыть все ответы
Ответ:
kanat9809
kanat9809
27.04.2022
ответ: 21Объяснение:

Каким бы длинным решение не казалось - это не так, оно очень короткое, просто очень подробно расписано во всех деталях. Итак, что нам известно:

Команда 1: +1Команда 2: *2Начальное: 2Конечное: 34Проходит через: 10Не проходит через: 28

Траектория вычислений должна содержать число 10. Узнаем сколько таких есть различных путей:

2 +1 +1 +1 +1 +1 +1 +1 +1 = 102 *2 +1 +1 +1 +1 +1 +1 = 10(2 +1) *2 +1 +1 +1 +1 = 10(2 +1 +1) *2 +1 +1 = 10(2 *2) *2 +1 +1 = 10(2 +1 +1 +1) *2 = 10(2 *2 +1) *2 = 10

Как мы видим - 7. Так как мы узнали все возможные пути до 10, узнаем теперь пути от 10 до 34. Чтобы они не проходили через число 28, нам нужно "перескочить" его, то есть какое-то число, меньшее 28, мы должны умножить на 2 и получить какое-то число, большее 28. Получаем такое неравенство: 10≤x<28 и 28<2x≤34

(10≤x<28 и 28<2x≤34) => (10≤x<28 и 14<x≤17) => (14<x≤17).

Подыщем такие значения:

10 +1 +1 +1 +1 +1 = 1510 +1 +1 +1 +1 +1 +1 = 1610 +1 +1 +1 +1 +1 +1 +1 = 17

Как мы видим - их 3. Дальше рассмотрим каждый:

15 *2 +1 +1 +1 +1 = 3416 *2 +1 +1 = 3417 * 2 = 34

Выходит для каждого только 1 вариант ("15+1", "15+1+1", "16+1" будет иметь такой же путь, как и просто 16 и 17, поэтому их не рассматриваем).

Получается 7 путей от 2 до 10 и 3 пути от 10 до 34. Итого: 7*3 = 21.

4,5(74 оценок)
Ответ:
Некий2006
Некий2006
27.04.2022

#include <iostream>

#include <set>

#include <vector>

using namespace std;

struct book{

   int name;

   int year;

   int k;

};

signed main() {

   ios_base::sync_with_stdio(0);

   cin.tie(0);

   cout.tie(0);

   vector<book> ans;

   int n;

   cin >> n;

   for(int i = 0; i < n; i++)

   {

       book bk;

       cin >> bk.name >> bk.year >> bk.k;

       if(bk.k >= 2 && bk.k <= 10)

           ans.push_back(bk);

   }

   for(auto i: ans)

       cout << i.name << " " << i.year << " " << i.k << "\n";

}

4,6(5 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ