一个警示(也可以说是问题)
查看原帖
一个警示(也可以说是问题)
1115455
ethansang楼主2024/10/12 19:08

如果你的代码类似这样:

#include <bits/stdc++.h>
using namespace std;
int t, k;
int c[2005][2005], s[2005][2005];

int main()
{
    cin >> t >> k;
    for (int i = 0; i <= 2000; i++)
        c[i][0] = 1;
    for (int i = 2; i <= 2000; i++)
        for (int j = 1; j <= i; j++)
            c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;
    for (int i = 2; i <= 2000; i++){
        for (int j = 1; j <= i; j++){
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
            if (c[i][j] == 0)
                s[i][j]++;
        }
        s[i][i + 1] = s[i][i];
    }
    while (t--){
        int n, m;
        cin >> n >> m;
        if (m > n)
            m = n;
        cout << s[n][m] << endl;
    }
    
    return 0;
}

那么, 你应该是5分, 其余全WA。

然而, 当你改成这样:

#include <bits/stdc++.h>
using namespace std;
int t, k;
int c[2005][2005], s[2005][2005];

int main()
{
    cin >> t >> k;
    for (int i = 0; i <= 2000; i++){
        c[i][0] = 1;
        c[i][i] = 1; //看这一行
    }
    for (int i = 2; i <= 2000; i++)
        for (int j = 1; j < i; j++) //和这一行的符号
            c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;
    for (int i = 2; i <= 2000; i++){
        for (int j = 1; j <= i; j++){ 
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
            if (c[i][j] == 0)
                s[i][j]++;
        }
        s[i][i + 1] = s[i][i];
    }
    while (t--){
        int n, m;
        cin >> n >> m;
        if (m > n)
            m = n;
        cout << s[n][m] << endl;
    }
    
    return 0;
}

怎么就AC了?

2024/10/12 19:08
加载中...