Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

PROG666's blog

By PROG666, 5 weeks ago, In Russian

В большинстве задач нам хватает вместительности long long (64 бита), но в некоторых задачах приходится писать длинную арифметику, однако есть и те, в которых хватит 128 бит, именно поэтому в C++ существует тип __int128. Если вы используете Microsoft Visual Studio, то забудьте про него, его там нет). Теперь расскажу про его особенности:

  • существует как знаковый __int128(от $$$-2^{127}+1$$$ до $$$2^{127}-1$$$, что примерно от $$$-10^{38}$$$ до $$$10^{38}$$$) так и беззнаковый unsigned __int128(от $$$0$$$ до $$$2^{128}-1$$$, что примерно $$$3*10^{38}$$$)
точные значения степеней двойки)
  • с ним можно делать все те же арифметические операции + - * / % += -= *= /= %= ++ --, битовые операции | & ^ << >>, а также сравнивать < > <= >= == !=

  • можно использовать и функции abs(), sqrt(), swap()

  • его можно перевести в long long, int, short, то есть если __int128 a то можно сделать long long(a), int(a), short(a), и наоборот если есть long long a или int a или short a то можно написать __int128(a)

  • Его нельзя считать или вывести с помощью cout cin, но ниже я привел код чтобы это было делать можно)

  • к великому сожалению написать a = 123456789123456789123456789 не получится придётся либо строку переводить в число либо писать извращённо a = 12345678912345, a = a * 10000000000000 + 6789123456789;

  • советую использовать using lll = __int128 и using ull = unsigned __int128

Моя шапка для использования __int128 и unsigned __int128

Happy coding!)

  • Vote: I like it
  • +14
  • Vote: I do not like it