公式
C - Between P and Q 解説
by
C - Between P and Q 解説
by
sounansya
\((1,2,\ldots,N)\) を並び替えてできる整数列は \(N!\) 通りあります。これは \(N\le 10\) では最大でも \(3628800\) 通りなので、これら全てに対して条件を満たすかを判定すれば良いです。
\((1,2,\ldots,N)\) を並び替えてできる整数列は例えば C++ なら next_permutation を用いることで全て重複なく列挙することができます。
#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;
}
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\) で割ったあまりを求めてみましょう。
投稿日時:
最終更新:
