В вашем l oop выражение 1 + (N + 1 - i) * i
(которое оценивается как long long int
) быстро и часто становится больше INT_MAX
, и это вызывает переполнение целых чисел при попытке добавьте его к (int
) result
.
Добавление быстрой «проверки» в ваш код, как показано ниже, продемонстрирует это:
int main()
{
cin >> N >> K;
long long int result = 0;
int IntResult = 0;
int count = 0;
for (long long int i = K; i <= N + 1; i++) {
// Check for intermediate overflow potential...
long long int lli = 1LL + (N + 1LL - i) * i;
if (lli > INT_MAX) cout << lli << " (" << ++count << ")" << endl;
result += 1 + (N + 1 - i) * i;
IntResult += 1 + (N + 1 - i) * i;
}
cout << result % (1000000000 + 7) << endl;
cout << IntResult % (1000000000 + 7) << endl;
return 0;
}
Когда я запускаю это Код на моей платформе (32-битный int
и 64-битный long long int
) с вашими заданными входами (141421
и 35623
), строка "проверка переполнения" фактически происходит 88,498 раз ! Вот последние три строки вывода:
...
2147524241 (88498)
220280457
619089693
Более того, даже если проверенное выше дополнение не может само по себе переполнить int
, результат добавления его к существующему (потенциально не -зеро) значение в result
все еще может сделать это. Действительно, изменение строки 'check' на это:
if ((lli + result) > INT_MAX) cout << lli << " (" << ++count << ")" << endl;
показывает, что l oop переполняется на на каждой итерации!