求调
  • 板块P2435 染色
  • 楼主CQ天神
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 11:26
  • 上次更新2024/7/12 12:50:57
查看原帖
求调
959024
CQ天神楼主2024/7/12 11:26
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 376544743;
int main() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> first_row(m), last_row(m);
    for (int i = 0; i < m; ++i) {
        cin >> first_row[i];
    }
    for (int i = 0; i < m; ++i) {
        cin >> last_row[i];
    }
    if (n == 1) {
        bool valid = true;
        for (int i = 0; i < m; ++i) {
            if (first_row[i] != last_row[i]) {
                valid = false;
                break;
            }
        }
        cout << (valid ? 1 : 0) << endl;
        return 0;
    }
    vector<vector<vector<long long>>> dp(m, vector<vector<long long>>(k, vector<long long>(k, 0)));
    for (int i = 0; i < m - 1; ++i) {
        if (first_row[i] != first_row[i + 1]) {
            dp[i][first_row[i]][first_row[i + 1]] = 1;
        }
    }
    for (int row = 1; row < n - 1; ++row) {
        vector<vector<vector<long long>>> new_dp(m, vector<vector<long long>>(k, vector<long long>(k, 0)));
        for (int i = 0; i < m; ++i) {
            for (int c1 = 0; c1 < k; ++c1) {
                for (int c2 = 0; c2 < k; ++c2) {
                    if (dp[i][c1][c2] > 0) {
                        for (int new_c1 = 0; new_c1 < k; ++new_c1) {
                            if (new_c1 != c1) {
                                for (int new_c2 = 0; new_c2 < k; ++new_c2) {
                                    if (new_c2 != c2 && new_c2 != new_c1) {
                                        new_dp[i][new_c1][new_c2] = (new_dp[i][new_c1][new_c2] + dp[i][c1][c2]) % MOD;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        dp = new_dp;
    }
    long long result = 0;
    for (int i = 0; i < m - 1; ++i) {
        for (int c1 = 0; c1 < k; ++c1) {
            if (c1 == last_row[i]) continue;
            for (int c2 = 0; c2 < k; ++c2) {
                if (c2 == last_row[i + 1]) continue;
                result = (result + dp[i][c1][c2]) % MOD;
            }
        }
    }
    cout << result << endl;
    return 0;
}
2024/7/12 11:26
加载中...