Як зазначає OP, 1ll оголошує літерал long long integer.25 жовт. 2014 р
LL є суфіксом для довгого довгого, який є 64-розрядним у більшості реалізацій C/C++. Отже, 1LL є 1 типу long long. // вирішує проблему в коді вище. Ось ще одне місце, де цей трюк може вам допомогти.
2.14.2 Цілі літерали LL є суфіксом для довго-довго, який є 64-розрядним у більшості (всіх?) реалізацій C/C++. Отже, 0LL — це 64-розрядний літерал зі значенням 0.
0L – це тип довгий , 0LL має тип long long . У std::accumulate тип повернення такий самий, як і тип останнього аргументу. cppreference навіть попереджає про таку ситуацію: якщо залишено для виведення типу, op працює зі значеннями того самого типу, що й init, що може призвести до небажаного приведення елементів ітератора.
Літери в цілочисельних літералах нечутливі до регістру: 0xDeAdBeEfU та 0XdeadBEEFu представляють одне й те саме число (одним винятком є суфікс long-long-, який є ll або LL, ніколи не lL або Ll )(починаючи з C++11).
Як зазначає OP, 1ll оголошує літерал long long integer. Його присутність тут у коді сприяє повному перетворенню множення на long long за допомогою звичайних арифметичних перетворень, зокрема цілочисельних просувань. Використовується, щоб уникнути переливу.
довгий довгий внутр: символ ll або LL у кінці цілочисельної константи. unsigned long long int: символ ull або ULL у кінці цілочисельної константи.