結果

問題 No.3099 Parentheses Decomposition
ユーザー wsrtrt
提出日時 2025-04-11 21:28:03
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 43 ms / 2,000 ms
コード長 3,891 bytes
コンパイル時間 3,607 ms
コンパイル使用メモリ 279,464 KB
実行使用メモリ 15,572 KB
最終ジャッジ日時 2025-04-11 21:28:08
合計ジャッジ時間 4,297 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto& i:a)
#define ff first 
#define ss second 
#define all(a) begin(a),end(a)
#define allr(a) rbegin(a),rend(a)
#define pb push_back
using ll =long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using vi=vector<int>;
using vll=vector<ll>;
template<class T> inline bool chmin(T& a,T b){return a>b?a=b,1:0;}
template<class T> inline bool chmax(T& a,T b){return a<b?a=b,1:0;}

const int INFI=numeric_limits<int>::max()/2;
const ll INFL=numeric_limits<ll>::max()/2;

void solve(){
    
}
struct nCk{
    vector<long long> fact, fact_inv, inv;
    int m=998244353;
    nCk(int _n){
        init(_n);
    }
    nCk(int _n,int _m){
        m=_m;
        init(_n);
        
    }
    //計算量O(n)
    void init(int SIZE){
        fact.resize(SIZE + 5);
        fact_inv.resize(SIZE + 5);
        inv.resize(SIZE + 5);
        fact[0] = fact[1] = 1;
        fact_inv[0] = fact_inv[1] = 1;
        inv[1] = 1;
        for (int i = 2; i < SIZE + 5; i++) {
            fact[i] = fact[i - 1] * i % m;
            inv[i] = m - inv[m % i] * (m / i) % m;
            fact_inv[i] = fact_inv[i - 1] * inv[i] % m;
        }
    }
    //計算量O(1)
    long long C(int n,int k){
        assert(!(n<k));
        assert(!(n<0||k<0));
        assert(n<fact.size());
        return fact[n]*(fact_inv[k]*fact_inv[n-k]%m)%m;
    }
    long long H(int n,int r){
        assert(n>=0&&r>=0);
        return r == 0 ? 1 : C(n + r - 1, r);
    }
    long long P(int n,int r){
        assert(r>=0&&r>=n);
        assert(n<fact.size());
        return (fact[n]*fact_inv[n-r])%m;
    }
};
//modint
template <std::uint_fast64_t Modulus> class modint {
    using u64 = std::uint_fast64_t;

public:
    u64 a;

    constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {}
    constexpr u64 &val() noexcept { return a; }
    constexpr const u64 &val() const noexcept { return a; }
    constexpr modint operator+(const modint rhs) const noexcept {
        return modint(*this) += rhs;
    }
    constexpr modint operator-(const modint rhs) const noexcept {
        return modint(*this) -= rhs;
    }
    constexpr modint operator*(const modint rhs) const noexcept {
        return modint(*this) *= rhs;
    }
    constexpr modint operator/(const modint rhs) const noexcept {
        return modint(*this) /= rhs;
    }
    constexpr modint &operator+=(const modint rhs) noexcept {
        a += rhs.a;
        if (a >= Modulus) {
            a -= Modulus;
        }
        return *this;
    }
    constexpr modint &operator-=(const modint rhs) noexcept {
        if (a < rhs.a) {
            a += Modulus;
        }
        a -= rhs.a;
        return *this;
    }
    constexpr modint &operator*=(const modint rhs) noexcept {
        a = a * rhs.a % Modulus;
        return *this;
    }
    constexpr modint &operator/=(modint rhs) noexcept {
        u64 exp = Modulus - 2;
        while (exp) {
        if (exp % 2) {
          *this *= rhs;
        }
        rhs *= rhs;
        exp /= 2;
        }
        return *this;
    }
};
using mint9=modint<998244353>;
using mint1=modint<1000000007>;
long long modpow(long long a, long long n, long long mod) {
    a%=mod;
    assert(a!=0||n!=0);
    if(a==0)return 0;
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n;string s;cin>>n>>s;
    int cnt{};
    rep(i,0,n/2)cnt+=s[i]=='(';
    nCk comb(n);
    if(cnt==n/2){
        //A
        mint9 ans=0;
        rep(i,0,n/2+1){
            ans+=comb.C(n/2,i)*comb.C(n/2,i);
        }
        cout<<ans.val()<<endl;
    }else{
        //B
        cout<<modpow(2,n/2,998244353)<<endl;
    }
    return 0;
}
/*

*/
0