Submission #28025623


Source Code Expand

#include <bits/stdc++.h>
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define rep2(i,k,n) for (int i = (k); i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int,int>;
// using P = pair<ll,ll>;

const ll INF = (ll)1e18;
// const int INF = (int)1e9+7;
template<typename T>
void chmin(T &a, T b) { a = min(a, b); }
template<typename T>
void chmax(T &a, T b) { a = max(a, b); }

// const int mod = 1000000007;
const int mod = 998244353;
struct mint {
  ll x; // typedef long long ll;
  mint(ll x=0):x((x%mod+mod)%mod){}
  mint operator-() const { return mint(-x);}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator-=(const mint a) {
    if ((x += mod-a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}
  mint operator+(const mint a) const { return mint(*this) += a;}
  mint operator-(const mint a) const { return mint(*this) -= a;}
  mint operator*(const mint a) const { return mint(*this) *= a;}
  mint pow(ll t) const {
    if (!t) return 1;
    mint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(mod-2);}
  mint& operator/=(const mint a) { return *this *= a.inv();}
  mint operator/(const mint a) const { return mint(*this) /= a;}
};
istream& operator>>(istream& is, mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}

void solve() {
    mint H, W;
    int K;
    cin >> H >> W >> K;

    ll x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    vector<vector<mint>> dp(2, vector<mint>(2, 0));
    dp[x1==x2][y1==y2] = 1;

    while (K--) {
        vector<vector<mint>> nx(2, vector<mint>(2,0));
        nx[0][0] = (W-1)*dp[0][1] + (H-1)*dp[1][0] + (H+W-4)*dp[0][0];
        nx[0][1] = dp[0][0] + (H-2)*dp[0][1] + (H-1)*dp[1][1];
        nx[1][0] = dp[0][0] + (W-2)*dp[1][0] + (W-1)*dp[1][1];
        nx[1][1] = dp[0][1] + dp[1][0];
        swap(dp, nx);
    }

    cout << dp[1][1] << endl;
}

int main() {
    solve();
    return 0;
}

Submission Info

Submission Time
Task E - Rook Path
User goropikari
Language C++ (GCC 9.2.1)
Score 500
Code Size 2264 Byte
Status AC
Exec Time 78 ms
Memory 3564 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 3
AC × 26
Set Name Test Cases
Sample example_00.txt, example_01.txt, example_02.txt
All example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt
Case Name Status Exec Time Memory
example_00.txt AC 4 ms 3468 KiB
example_01.txt AC 75 ms 3548 KiB
example_02.txt AC 2 ms 3508 KiB
test_00.txt AC 78 ms 3400 KiB
test_01.txt AC 72 ms 3492 KiB
test_02.txt AC 15 ms 3396 KiB
test_03.txt AC 31 ms 3396 KiB
test_04.txt AC 12 ms 3388 KiB
test_05.txt AC 67 ms 3552 KiB
test_06.txt AC 20 ms 3464 KiB
test_07.txt AC 30 ms 3400 KiB
test_08.txt AC 49 ms 3564 KiB
test_09.txt AC 53 ms 3404 KiB
test_10.txt AC 55 ms 3548 KiB
test_11.txt AC 44 ms 3496 KiB
test_12.txt AC 7 ms 3468 KiB
test_13.txt AC 35 ms 3492 KiB
test_14.txt AC 43 ms 3496 KiB
test_15.txt AC 40 ms 3488 KiB
test_16.txt AC 51 ms 3504 KiB
test_17.txt AC 44 ms 3452 KiB
test_18.txt AC 52 ms 3548 KiB
test_19.txt AC 59 ms 3496 KiB
test_20.txt AC 23 ms 3400 KiB
test_21.txt AC 59 ms 3456 KiB
test_22.txt AC 54 ms 3564 KiB