无法在C++中为SAFECRAC SPOJ正确使用MODULO操作

Unable to use MODULO operation correctly in C++ for SAFECRAC SPOJ?

本文关键字:MODULO 操作 SPOJ C++ 中为 SAFECRAC      更新时间:2023-10-16

我正在努力解决问题http://www.spoj.com/problems/SAFECRAC.

我认为使用动态编程可以很容易地解决这个问题,但由于最终答案非常大,我们必须输出答案MODULO 1000000007。我似乎无法正确使用MODULO操作,因为我得到了长度为3的正确输出,但长度为25的输出与样本不同。

这是我的代码:

#include <iostream>
using namespace std;
#define MOD 1000000007
typedef long long int ll;
ll dp[100001][10];
int t, n;       
void precompute()
{
    for (int j = 0; j < 10; j++)
        dp[1][j] = 1;
    for (int i = 2; i <= 100000; i++) {
        for (int j = 0; j < 10; j++) {
            if (j == 0) dp[i][j] = dp[i-1][7] % MOD;
            if (j == 1) dp[i][j] = ( dp[i-1][2] + dp[i-1][4] ) % MOD;
            if (j == 2) dp[i][j] = ( dp[i-1][1] + ( dp[i-1][3] + dp[i-1][5] ) % MOD ) % MOD;
            if (j == 3) dp[i][j] = ( dp[i-1][2] + dp[i-1][6] ) % MOD;
            if (j == 4) dp[i][j] = ( dp[i-1][1] + ( dp[i-1][5] + dp[i-1][7] ) % MOD ) % MOD;
            if (j == 5) dp[i][j] = ( ( dp[i-1][2] + dp[i-1][4] ) % MOD + ( dp[i-1][6] + dp[i-1][8] ) % MOD ) % MOD;
            if (j == 6) dp[i][j] = ( dp[i-1][3] + ( dp[i-1][5] + dp[i-1][9] ) % MOD ) % MOD;
            if (j == 7) dp[i][j] = ( dp[i-1][4] + ( dp[i-1][8] + dp[i-1][0] ) % MOD ) % MOD;
            if (j == 8) dp[i][j] = ( dp[i-1][5] + ( dp[i-1][7] + dp[i-1][9] ) % MOD ) % MOD;
            if (j == 9) dp[i][j] = ( dp[i-1][6] + dp[i-1][8] ) % MOD;
        }
    }
}
int main()
{
    precompute();
    cin >> t;
    while (t--) {
        cin >> n;
        ll sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += dp[n][i];
        }
        cout << sum << endl;
    }
}

检查main()中的for循环。dp[n][i]总是小于MOD,但这对于sum是不保证的。因此,请尝试将sum += dp[n][i];更改为sum = (sum + dp[n][i]) % MOD;