№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Название |
---|
Суть решения у тебя неправильная. Как я помню квадратный корень не может выступать коэффициентом в рекуррентном соотношении.
UPD: Сорри написал не подумав
Сначала я поставил этому комментарию плюс, но потом понял, что он не по теме.
Изначально, в выражении присутствует квадратный корень, это верно. Кажется, что оно нелинейное. Но можно заметить, что
Таким образом, получаем линейную последовательность для нахождения слагаемого с корнем. А, значит, и линейную последовательность для исходной задачи.
Правда, я пока не понял, почему даёт WA.
UPD: мучался с задачей полчаса, в итоге падают ассерты на 178 и 180 строке в коде. Видимо, тесты какие-то «хитрые».
UPD2: как-то зашаманил с кодом, получил AC (diff от оригинального решения в посте). Самое главное шаманство (устраняющее WA):
A[1][3] = sqrt(3 + static_cast<long double>(f0) * f1);
Насчёт TL'a: мне нравится пользоваться трюком от Alex_2oo8. Суть в том, что если нам надо перемножить две матрицы А и В и положить результат в матрицу С, то будем брать С по модулю MOD * MOD (т.к. A[i][k] < MOD, B[k][j] < MOD => A[i][k] * B[k][j] < MOD * MOD). Это можно сделать без взятия по модулю вообще — достаточно одного if'a (если превысили MOD * MOD, то вычтем его один раз, поскольку большее количество не могло быть). В конце возьмём C[i][j] по модулю MOD. В итоге на каждый элемент матрицы по одному взятию по модулю.
Я когда-то рассказывал про оптимизацию таких вещей.
Теперь не по теме: мне хочется за такую работу с матрицами очень больно надавать по рукам. Матрицу можно представлять так:
И тогда получится код, который читать будет намного приятнее.
И да, в C++ и в современном C принято константы определять через
const
, а не через#define
.UPD. И еще меня смущает строчка
A[1][3] = sqrt(3 + f0 * f1);
. Извлекать квадратный корень из целого числа таким способом вообще не следует. Рекомендую в данный момент воспользоваться бинпоиском, а потом на досуге разобраться с арифметикой с плавающей точкой и проблемами с приведением к целочисленному типу.sqrt работает заметно быстрее бинпоиска. Чтобы уладить возможные неточности из-за вещественных чисел, надо просто потом пустить по циклу while в каждую сторону.
Более того, конкретно в этой задаче достаточно одного цикла в большую сторону.