公式

C - Between P and Q 解説 by sounansya


\((1,2,\ldots,N)\) を並び替えてできる整数列は \(N!\) 通りあります。これは \(N\le 10\) では最大でも \(3628800\) 通りなので、これら全てに対して条件を満たすかを判定すれば良いです。

\((1,2,\ldots,N)\) を並び替えてできる整数列は例えば C++ なら next_permutation を用いることで全て重複なく列挙することができます。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin >> n;
	vector<int> p(n), q(n);
	for (int &v : p) cin >> v;
	for (int &v : q) cin >> v;
	vector<int> a(n);
	iota(a.begin(), a.end(), 1);
	int ans = 0;
	do {
		if (p < a && a < q) ans++;
	} while (next_permutation(a.begin(), a.end()));
	cout << ans << endl;
}

実装例(Python)

from itertools import permutations

n = int(input())
p = list(map(int, input().split()))
q = list(map(int, input().split()))
ans = 0
for a in permutations([i + 1 for i in range(n)]):
    ans += p < list(a) < q
print(ans)

Bonus:\(N\le 10^5\) で答えを \(998244353\) で割ったあまりを求めてみましょう。

投稿日時:
最終更新: