【6.28校內test】T3 【音樂會】道路千萬條

【音樂會】道路千萬條【題目連接】html

首先,你能夠忽略上面的一大坨題面,只須要看說明的那一小部分就好啦。c++

而後理解題意:數組

就是說咱們要給這n-1個運算符指定一個順序,統計全部值爲true的方案數pt,統計全部值爲false的方案數pf,而後算pt/(pt+pf) mod 998244353

而後water_lift就想到了表達式的值【題解】,考慮最後算哪一個運算符,一共有n-1種選擇。spa

而後三種狀況:code

1.最後計算的運算符是‘&’。htm

那麼使表達式爲true的方案數就是運算符左邊爲true的方案數*運算符右邊爲true的方案數(乘法原理)。blog

使表達式爲false的方案數是左邊爲true*右邊爲false+左邊false*右邊true+左邊false*右邊false。get

2.最後計算的運算符是‘|’。it

那麼使表達式爲true的方案數爲:左邊true*右邊false+左邊false*右邊true+左邊true*右邊true;io

使表達式爲false的方案數爲:左邊false*右邊false;

3.最後計算的運算符是'^'。

那麼使表達式爲true的方案數爲:左邊false*右邊true+左邊true*右邊false;

使表達式爲false的方案數爲:左邊false*右邊false+左邊true*右邊true;

因此定義兩個數組,t[l][r]表示區間[l,r]爲true的方案數,f[l][r]表示區間[l,r]爲false的方案數。

那麼最終答案就是t[1][n]/(t[1][n]+f[1][n])mod 998244353;

而後顯然是能夠搜索的,可是我寫鍋了(而且我不想看

所以咱們仍是看DP的解法吧;

就是類比表達式的值,而後求就好辣;(主要是不知道該寫啥qwq)

#include<bits/stdc++.h>

using namespace std;

inline int read(){
    int ans=0;
    char last=' ',ch=getchar();
    while(ch>'9'||ch<'0') last=ch,ch=getchar();
    while(ch<='9'&&ch>='0') ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar(); 
    if(last=='-') ans=-ans;
    return ans;
}

inline char gc(){
    char c;
    do{
        c=getchar();
    }while(c==' '||c=='\n'||c=='\r'||c=='\0'||c=='\t');
    return c;
}

int n;
char s[501],ops[501];
long long t[501][501],f[501][501];
const int mod=998244353;
pair<long long,long long>extgcd(long long a,long long b){
    if(b==0){
        return make_pair<long long ,long long>(1,0);
    }
    pair<long long,long long>rtn=extgcd(b,a%b);
    rtn.first^=rtn.second^=rtn.first^=rtn.second;//交換兩個變量 
    rtn.second-=a/b*rtn.first;
    return rtn;
}

int main(){
    n=read();
    for(int i=1;i<=n-1;i++){
        s[i]=gc();
        ops[i]=gc();
    }
    s[n]=gc();
    for(int i=1;i<=n;i++){
        if(s[i]=='t')
          t[i][i]=1,f[i][i]=0;
        else 
          t[i][i]=0,f[i][i]=1;
    }
    for(int len=2;len<=n;len++){
        for(int i=1;i+len-1<=n;i++){
            int j=i+len-1;
            for(int k=i;k<j;k++){
                if(ops[k]=='&'){
                t[i][j]=(t[i][j]+(t[i][k]*t[k+1][j])%mod)%mod;
                f[i][j]=(f[i][j]+(t[i][k]*f[k+1][j])%mod+(f[i][k]*t[k+1][j])%mod+(f[i][k]*f[k+1][j])%mod)%mod; 
                }
                if(ops[k]=='|'){
                    f[i][j]=(f[i][j]+(f[i][k]*f[k+1][j])%mod)%mod;
                    t[i][j]=(t[i][j]+(t[i][k]*f[k+1][j])%mod+(f[i][k]*t[k+1][j])%mod+(t[i][k]*t[k+1][j])%mod)%mod;
                }
                if(ops[k]=='^'){
                    t[i][j]=(t[i][j]+(t[i][k]*f[k+1][j])%mod+(f[i][k]*t[k+1][j])%mod)%mod;
                    f[i][j]=(f[i][j]+(f[i][k]*f[k+1][j])%mod+(t[i][k]*t[k+1][j])%mod)%mod;
                }
            }
        }
    }
    cout<<(t[1][n]*((extgcd(t[1][n] +f[1][n]%mod,mod).first%mod+mod)%mod))%mod<<endl;
    return 0;
}

end-

相關文章
相關標籤/搜索