为什么输出的时候还要取模?
查看原帖
为什么输出的时候还要取模?
671013
KawaragiMomoka楼主2023/11/5 20:36
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

// #define DEBUG

typedef long long ll;
const ll maxn = 1e3 + 5;
const ll mod = 998244353;
ll T, id;
ll n, m, c, f;
char graph[maxn][maxn];
ll sum[maxn][maxn];

// !(I AK IOI)
// ToT

int main() {
    scanf("%lld%lld", &T, &id);
    while (T--) {
        memset(sum, 0, sizeof(sum));
        memset(graph, 0, sizeof(graph));
        scanf("%lld%lld%lld%lld", &n, &m, &c, &f);
        for (ll i = 1; i <= n; i++) {
            char str[maxn];
            scanf("%s", str + 1);
            for (ll j = 1; j <= m; j++) {
                graph[i][j] = str[j];
            }
        }
        for (ll i = 1; i <= n; i++) {
            for (ll j = m - 1; j >= 1; j--) {
                if (graph[i][j] == '1') {
                    sum[i][j] = -1;
                } else if (graph[i][j + 1] == '0') {
                    sum[i][j] = (sum[i][j + 1] + 1) % mod;
                }
            }
        }
#ifdef DEBUG
        for (ll i = 1; i <= n; i++) {
            for (ll j = 1; j <= m; j++) {
                printf("%lld ", sum[i][j]);
            }
            printf("\n");
        }
#endif
        ll cntc = 0, cntf = 0;
        for (ll j = 1; j < m; j++) {
            ll legalc = 0, legalf = 0;
            for (ll i = 1; i <= n; i++) {
                if (sum[i][j] == -1) {
                    legalc = legalf = 0;
                    continue;
                }
                (cntc += (sum[i][j] * legalc) % mod) % mod;
                (cntf += (legalf % mod)) % mod;
                (legalf += (sum[i][j] * legalc) % mod) % mod;
                (legalc += max(0ll, sum[i - 1][j])) % mod;
            }
        }
        printf("%lld %lld\n", cntc * c % mod, cntf * f % mod);
    }
    return 0;
}

如题,在最后输出的时候

printf("%lld %lld\n", cntc * c % mod, cntf * f % mod);

这样子就没事,但如果不取模的话

printf("%lld %lld\n", cntc * c, cntf * f);

就只有78分。 这是为什么啊?

2023/11/5 20:36
加载中...