PS

백준 1722번 [순열의 순서]

binning 2025. 2. 20. 16:03

팩토리얼을 이용한 순열 구현

next_permutation보다 시간복잡도 빠름

ll fac[21];
vector<ll> v;
bool visited[21] = { 0, };

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int n, q;
	cin >> n >> q;
	fac[0] = 1;
	for (int i = 1; i <= 20; i++) {
		fac[i] = fac[i - 1] * i;
	}

	if (q == 1) {
		ll k;
		cin >> k;
		for (int i = n-1; i >= 0; i--) {
			ll cnt = 1;
			for (int j = 1; j <= n; j++) {
				if (visited[j]) {
					continue;
				}
				if (k <= cnt * fac[i]) {
					k -= ((cnt - 1) * fac[i]);
					v.push_back(j);
					visited[j] = true;
					break;
				}
				cnt++;
			}
		}
		for (int i = 0; i < n; i++) {
			cout << v[i] << " ";
		}
	}
	else if (q == 2) {
		ll ans = 1;
		for (int i = 0; i < n; i++) {
			ll x;
			ll cnt = 0;
			cin >> x;
			v.push_back(x);
			for (int j = 1; j < v[i]; j++) {
				if (visited[j] == false) {
					cnt++;
				}
			}
			ans += cnt * fac[n - 1 - i];
			visited[x] = true;
		}
		cout << ans;
	}
	return 0;
}

'PS' 카테고리의 다른 글

백준 DP모음  (0) 2025.02.20
백준 1256번 [사전]  (0) 2025.02.20
백준 2343번 [기타 레슨]  (0) 2025.02.19
백준 2023번 [신기한 소수]  (0) 2025.02.18
백준 1517번 [버블 소트]  (0) 2025.02.12