Official

A - >_< Editorial by penguinman


\(i\ (2 \leq i \leq N)\) について、問題文中の \(2\) つの条件(任意の \(j\ (\lt i)\) について \(P_j \lt P_i\) が成り立つか、あるいは \(P_j \gt P_i\) が成り立つか)のうちどちらが満たされるかを決め打ったとします。

決め打ち方は \(2^{N-1}\) 通りありますが、そのそれぞれと出来上がる \(P\) は一対一で対応します。

よって答えは \(2^{N-1}\) となります。計算量は繰り返し二乗法を用いると \(O(\log N)\) です。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

using ll = long long;

const int mod = 998244353;

ll modpow(ll X, ll Y){
    ll ret = 1;
    while(0 < Y){
        if(Y & 1){
            ret = ret*X%mod;
        }
        X = X*X%mod;
        Y >>= 1;
    }
    return ret;
}

int main(){
    ll N; cin >> N;
    cout << modpow(2,N-1) << endl;
}

なお、Python の pow 関数を用いると非常に簡単に AC することができます。

実装例 (Python)

print(pow(2,int(input())-1,998244353))

posted:
last update: