Submission #332065

# Submission time Handle Problem Language Result Execution time Memory
332065 2020-12-01T10:50:51 Z alextodoran Fishing Game (RMI19_fishing) C++17
70 / 100
2000 ms 83056 KB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N_MAX = 102;

const int MOD = 1e9+7;

int n, t;

int dp[3 * N_MAX][3 * N_MAX][3 * N_MAX];

bool a[3 * N_MAX], b[3 * N_MAX], c[3 * N_MAX];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> t;
    dp[0][0][0] = 1;
    for(int s = 1; s <= 6 * n; s++)
        for(int i = 0; i <= 3 * n && i <= s; i++)
            for(int j = 0; j <= 3 * n && i + j <= s; j++)
            {
                int k = s - i - j;
                if(k > 3 * n)
                    continue;
                for(int x = 1; x <= 3; x++)
                    for(int y = 1; y <= 3; y++)
                        for(int z = 1; z <= 3; z++)
                        {
                            int i1 = i, j1 = j, k1 = k;
                            bool ok = false;
                            int prod = 1;
                            if(x == 1)
                            {
                                if(i1 + k1 > 0)
                                    continue;
                            }
                            else if(x == 2)
                            {
                                if(i1 == 0)
                                    continue;
                                prod *= i1;
                                i1--;
                                ok = true;
                            }
                            else if(x == 3)
                            {
                                if(k1 == 0)
                                    continue;
                                prod *= k1;
                                j1++;
                                k1--;
                            }
                            if(y == 1)
                            {
                                if(j1 + i1 > 0)
                                    continue;
                            }
                            else if(y == 2)
                            {
                                if(j1 == 0)
                                    continue;
                                prod *= j1;
                                j1--;
                                ok = true;
                            }
                            else if(y == 3)
                            {
                                if(i1 == 0)
                                    continue;
                                prod *= i1;
                                k1++;
                                i1--;
                            }
                            if(z == 1)
                            {
                                if(k1 + j1 > 0)
                                    continue;
                            }
                            else if(z == 2)
                            {
                                if(k1 == 0)
                                    continue;
                                prod *= k1;
                                k1--;
                                ok = true;
                            }
                            else if(z == 3)
                            {
                                if(j1 == 0)
                                    continue;
                                prod *= j1;
                                i1++;
                                j1--;
                            }
                            if(ok == false)
                                continue;
                            dp[i][j][k] = (dp[i][j][k] + 1LL * dp[i1][j1][k1] * prod) % MOD;
                        }
            }
    while(t--)
    {
        for(int i = 1; i <= n * 3; i++)
            a[i] = b[i] = c[i] = false;
        for(int i = 1; i <= n * 2; i++)
        {
            int card;
            cin >> card;
            a[card] = true;
        }
        for(int i = 1; i <= n * 2; i++)
        {
            int card;
            cin >> card;
            b[card] = true;
        }
        for(int i = 1; i <= n * 2; i++)
        {
            int card;
            cin >> card;
            c[card] = true;
        }
        int I = 0, J = 0, K = 0;
        for(int i = 1; i <= n * 3; i++)
            I += (a[i] && b[i]);
        for(int i = 1; i <= n * 3; i++)
            J += (b[i] && c[i]);
        for(int i = 1; i <= n * 3; i++)
            K += (c[i] && a[i]);
        cout << dp[I][J][K] << "\n";
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 492 KB Output is correct
3 Correct 4 ms 1644 KB Output is correct
4 Correct 34 ms 4972 KB Output is correct
5 Correct 483 ms 28196 KB Output is correct
6 Correct 997 ms 40296 KB Output is correct
7 Correct 1600 ms 54408 KB Output is correct
8 Execution timed out 2074 ms 68440 KB Time limit exceeded
9 Execution timed out 2069 ms 77108 KB Time limit exceeded
10 Execution timed out 2064 ms 83056 KB Time limit exceeded