문제링크
https://www.acmicpc.net/problem/25321
25321번: yo, i herd u liek ternary operators, so..
문제에서 요구하는 수를 1000000007로 나눈 나머지를 출력한다.
www.acmicpc.net
풀이
- 연속한 중첩되지 않은 ?: 쌍의 개수가 n 일 때 해석가능 경우의 수는 catalan(n) 이다
- ?: ?: ?: -> catalan(3)
- ? (1) : 과 같은 형태에 대하여 해석가능 경우의 수 는 (1) 해석 가능 경우의 수 ( (1) 안에는 0개 이상의 중첩되지 않은 ?: 쌍 개수)
- ?:??:?::?:?:?: -> ?:?(?:?:):?:?: -> catalan(4) * catalan(2) -> 28
- 같은 중첩 레벨에서 ?: 쌍의 연속 한 개수 의 카탈란 수의 곱이 답이 되겠다
코드
#include <bits/stdc++.h> using namespace std; #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define ll long long #define ld long double typedef pair<int, int> pi; typedef vector<int> vi; typedef vector<pair<int, int> > vpi; typedef vector<vector<int>> vvi; typedef pair<ll, ll> pl; typedef tuple<ll, ll, ll> t; typedef vector<ll> vl; typedef vector<pair<ll, ll>> vpl; typedef vector<vector<ll>> vvl; typedef vector<string> vs; int dr[4] = {0, 0, 1, -1}; int dc[4] = {1, -1, 0, 0}; // loops #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) FOR(i, 0, a) #define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i) #define R0F(i, a) ROF(i, 0, a) #define rep(a) F0R(_, a) #define each(a, x) for (auto &a : x) int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); #if !defined(ONLINE_JUDGE) freopen("../input.txt", "r", stdin); freopen("../output.txt", "w", stdout); #endif // ONLINE_JUDGE const ll MAX_N = 3e5 + 10; const ll MOD = 1e9 + 7; vl fact(MAX_N, 1); for (int i = 1; i < MAX_N; ++i) { fact[i] = i * fact[i - 1] % MOD; } auto power = [&](ll a, ll b) { ll ret = 1; while (b) { if (b & 1) ret = ret * a % MOD; a = a * a % MOD; b >>= 1; } return ret; }; auto inv = [&](ll a) { return power(a, MOD - 2); }; auto ncr = [&](ll n, ll r) { ll ret = fact[n]; ll denom = fact[r] * fact[n - r] % MOD; ret = ret * inv(denom) % MOD; return ret; }; auto catalan = [&](ll n) { // Calculate value of 2nCn ll c = ncr(2 * n, n); // return 2nCn/(n+1) // return c / (n + 1); return c * inv(n + 1) % MOD; }; ll ans = 1; stack<char> st; string s; cin >> s; for (int i = 0; i < s.size(); ++i) { if (s[i] != '?' && s[i] != ':') continue; if (s[i] == ':') { if (st.size() && st.top() == ':') { ll cnt = 0; while (st.size() >= 3) { auto prev = st.top(); st.pop(); auto pprev = st.top(); if (pprev == '?' && prev == ':') { ++cnt; st.pop(); } else { st.push(prev); break; } } ans = ans * catalan(cnt) % MOD; } } st.push(s[i]); } ll cnt = 0; while (st.size()) { auto prev = st.top(); st.pop(); auto pprev = st.top(); if (pprev == '?' && prev == ':') { ++cnt; st.pop(); } else { st.push(prev); break; } } ans = ans * catalan(cnt) % MOD; cout << ans; }
728x90
'PS > BOJ' 카테고리의 다른 글
백준 25320번: SCV 체인 (C++) (0) | 2023.06.27 |
---|---|
백준 25319번: Twitch Plays VIIIbit Explorer (C++) (0) | 2023.06.23 |
백준 25317번: functionx (C++) (0) | 2023.06.22 |
백준 25315번: N수매화검법 (C++) (0) | 2023.06.16 |
백준 1441번: 나누어 질까 (C++) (0) | 2023.06.13 |