Submission #125569

#TimeUsernameProblemLanguageResultExecution timeMemory
125569tutisKangaroo (CEOI16_kangaroo)C++17
51 / 100
2077 ms204600 KiB
/*input 10 2 3 */ #pragma GCC optimize ("O3") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; const ll modulo = 1000000007; ll fast(int N, int A, int B) { ll L[N + 1][N + 1][N + 1]; ll R[N + 1][N + 1][N + 1]; for (int n = 2; n <= N; n++) { for (int a = 1; a <= n; a++) { L[n][a][0] = 0; R[n][a][0] = 0; for (int b = 1; b <= n; b++) { L[n][a][b] = L[n][a][b - 1]; R[n][a][b] = R[n][a][b - 1]; if (a == b) continue; if (n == 2) { if (a > b) { L[n][a][b] = 1; } if (a < b) { R[n][a][b] = 1; } } else { L[n][a][b] += R[n - 1][a - (a > b)][n - 1]; L[n][a][b] -= R[n - 1][a - (a > b)][b - 1]; R[n][a][b] += L[n - 1][a - (a > b)][b - 1]; } L[n][a][b] %= modulo; R[n][a][b] %= modulo; } } } ll ret = L[N][A][B] - L[N][A][B - 1] + R[N][A][B] - R[N][A][B - 1]; ret %= modulo; ret += modulo; ret %= modulo; return ret; } ll R(int n, int a, int b); map<tuple<int, int, int>, int>LL; ll L(int n, int a, int b) { if (LL.count(make_tuple(n, a, b))) return LL[make_tuple(n, a, b)]; if (b == 0) return 0; ll ret = L(n, a, b - 1); if (a == b) return LL[make_tuple(n, a, b)] = ret; if (n == 2) { if (a > b) ret++; } else { ret += R(n - 1, a - (a > b), n - 1); ret -= R(n - 1, a - (a > b), b - 1); } ret %= modulo; return LL[make_tuple(n, a, b)] = ret; } map<tuple<int, int, int>, int>RR; ll R(int n, int a, int b) { if (RR.count(make_tuple(n, a, b))) return RR[make_tuple(n, a, b)]; if (b == 0) return 0; ll ret = R(n, a, b - 1); if (a == b) return RR[make_tuple(n, a, b)] = ret; if (n == 2) { if (a < b) ret++; } else { ret += L(n - 1, a - (a > b), b - 1); } ret %= modulo; return RR[make_tuple(n, a, b)] = ret; } ll faster(int N, int A, int B) { ll ret = L(N, A, B) - L(N, A, B - 1) + R(N, A, B) - R(N, A, B - 1); ret %= modulo; ret += modulo; ret %= modulo; return ret; } int main() { int n, a, b; cin >> n >> a >> b; //cout << fast(n, a, b) << "\n"; cout << faster(n, a, b) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...