https://yukicoder.me/problems/no/1062
とします。
以下の要素を黒丸、よりも大きい要素を白丸で表すことにすると以下のような状況になります。
このうち操作を行った後も同じ要素になるindexは以下の黒枠で囲った部分になります。
このように両方でswapされずに同じ要素になるindexと、両方でswapされて同じ要素になるindexがあることがわかります。前者の総数は解説にあるようにとなります。
後者の総数をとして、を求めることを考えます。
各indexで=(両方で白丸で、操作で黒丸とswapされてとなる数列の総数)が求まれば、となります。係数が2の理由ですが、○○がswapされる先は●●なので、両方で黒丸のindexも同数だけあるからです。
の状況は以下のようになります。
これを、
こうじゃ。
なので、=(後半に●●i個、前半に○●Y個と●●X-i個を好きなように並べた列に○○Z-1個を挿入した列の総数)となります。よって、
ですが、経路数を少し考えると
であることがわかるので、となります。
前半パートと合わせれば答えはです。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 998244353; int N, A, B; int main() { cin >> N >> A >> B; if(A > B) swap(A, B); ll x = A, y = B - A, z = N - B; ll fac = 1, nfac = 1; for(int i = 1; i <= N - 1; i++) { fac = fac * i % mod; if(i != y + 1) nfac = nfac * i % mod; } cout << ((x * x % mod + y * y % mod + z * z % mod) * fac + 2 * x * z % mod * nfac) % mod << endl; }