답안 #225176

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
225176 2020-04-19T10:59:28 Z Vimmer Mobitel (COCI19_mobitel) C++14
0 / 130
197 ms 65540 KB
#include <bits/stdc++.h>

//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")

#define F first
#define S second
#define sz(x) int(x.size())
#define pb push_back
#define N 100005
#define MOD ll(1e9 + 7)

using namespace std;

typedef long long ll;

typedef long double ld;



int a[101][101], dp[101][101], f[101][101][101][101], n, m, s, ans;

int mk[101][101];

vector <pair <ll, ll> >  vr;


inline void rec(int x, int y, ll sm, ll kol);

inline void dfs(int x, int y, int xr, int yr, int id)
{
    if (mk[x][y] == id) return;

    mk[x][y] = id;

    if (x + 1 != n)
    {
        if (a[x + 1][y] == 1) dfs(x + 1, y, xr, yr, id);
          else rec(x + 1, y, ll(ll(vr[id - 1].F) * ll(a[x + 1][y])), ll(ll(vr[id - 1].S) * ll(f[x][y][xr][yr])) % MOD);
    }

    if (y + 1 != m)
    {
        if (a[x][y + 1] == 1) dfs(x, y + 1, xr, yr, id);
          else rec(x, y + 1, ll(ll(vr[id - 1].F) * ll(a[x][y + 1])), ll(ll(vr[id - 1].S) * ll(f[x][y][xr][yr])) % MOD);
    }
}

inline void rec(int x, int y, ll sm, ll kol)
{
    if (sm >= s) {ans = (ans + (kol * ll(dp[x][y])) % MOD) % MOD; return;}

    if (a[x][y] == 1) {vr.pb({sm, kol}); dfs(x, y, x, y, sz(vr)); return;}

    if (x + 1 != n) rec(x + 1, y, sm * ll(a[x + 1][y]), kol);

    if (y + 1 != m) rec(x, y + 1, sm * ll(a[x][y + 1]), kol);
}


int main()
{

    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m >> s;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) cin >> a[i][j];

    dp[n - 1][m - 1] = 1;

    for (int i = n - 1; i >= 0; i--)
        for (int j = m - 1; j >= 0; j--)
        {
            if (i + 1 != n) dp[i][j] = (dp[i][j] + dp[i + 1][j]) % MOD;

            if (j + 1 != m) dp[i][j] = (dp[i][j] + dp[i][j + 1]) % MOD;
        }

    for (int xr = 0; xr < n; xr++)
        for (int yr = 0; yr < m; yr++)
        {
            if (a[xr][yr] != 1) continue;

            for (int x = 0; x < n; x++)
                for (int y = 0; y < m; y++) f[x][y][xr][yr] = 0;

            f[xr][yr][xr][yr] = 1;

            for (int x = 0; x < n; x++)
                for (int y = 0; y < m; y++)
                {
                    if (x != 0 && a[x - 1][y] == 1) f[x][y][xr][yr] = (f[x][y][xr][yr] + f[x - 1][y][xr][yr]) % MOD;

                    if (y != 0 && a[x][y - 1] == 1) f[x][y][xr][yr] = (f[x][y][xr][yr] + f[x][y - 1][xr][yr]) % MOD;
                }
        }
    rec(0, 0, a[0][0], 1);

    cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 23 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 24 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 182 ms 65540 KB Execution killed with signal 9 (could be triggered by violating memory limits)
4 Runtime error 156 ms 65536 KB Execution killed with signal 9 (could be triggered by violating memory limits)
5 Runtime error 154 ms 65540 KB Execution killed with signal 9 (could be triggered by violating memory limits)
6 Runtime error 158 ms 65540 KB Execution killed with signal 9 (could be triggered by violating memory limits)
7 Runtime error 197 ms 65540 KB Execution killed with signal 9 (could be triggered by violating memory limits)
8 Runtime error 24 ms 640 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 23 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 23 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)