Этот вопрос относится к оператору modulo %
. Мы знаем, что вообще a % b
возвращает остаток, когда a делится на b, а остаток больше или равен нулю и строго меньше b. Но выполняется ли это выше, когда a и b имеют величину 10^9?Может ли n% = m возвращать отрицательное значение для очень больших неотрицательных n и m?
я, кажется, получаю отрицательный выход для следующего кода для ввода:
74 41 28
Однако изменение окончательного вывода о делает работу, и результат становится правильным!
#include<iostream>
using namespace std;
#define m 1000000007
int main(){
int n,k,d;
cin>>n>>k>>d;
if(d>n)
cout<<0<<endl;
else
{
long long *dp1 = new long long[n+1], *dp2 = new long long[n+1];
//build dp1:
dp1[0] = 1;
dp1[1] = 1;
for(int r=2;r<=n;r++)
{
dp1[r] = (2 * dp1[r-1]) % m;
if(r>=k+1) dp1[r] -= dp1[r-k-1];
dp1[r] %= m;
}
//build dp2:
for(int r=0;r<d;r++) dp2[r] = 0;
dp2[d] = 1;
for(int r = d+1;r<=n;r++)
{
dp2[r] = ((2*dp2[r-1]) - dp2[r-d] + dp1[r-d]) % m;
if(r>=k+1) dp2[r] -= dp1[r-k-1];
dp2[r] %= m;
}
cout<<dp2[n]<<endl;
}
}
изменения окончательного вывода заявление:
if(dp2[n]<0) cout<<dp2[n]+m<<endl;
else cout<<dp2[n]<<endl;
делает работу, но почему это требовалось?
Кстати, код на самом деле мое решение this question
Значения, которые 'int' или' long long' могут удерживать, являются определенными реализациями и в значительной степени различаются. И если вы попытаетесь присвоить значение вне диапазона, результаты будут определены в результате реализации; вы не обязательно получаете отрицательное значение. –
.. но хороший компилятор выдаст предупреждение. К сожалению, многие новые программисты используются, чтобы игнорировать их, поскольку «они не являются ошибками, верно?» – quetzalcoatl