题解:P12057 [THUPC 2025 决赛] 好串

· · 题解

P12057 [THUPC 2025 决赛] 好串

题目分析

算法分析

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5+10;
const int MOD = 998244353;

int n;
int p[4][N];
int P[4],w;

int ksm(int base,int pw){
    int res=1;
    while(pw){
        if(pw&1) res=res*base%MOD;
        base=base*base%MOD;
        pw>>=1;
    }
    return res%MOD;
}

int mul(int x,int y,int z){
    x=(x+MOD)%MOD;
    y=(y+MOD)%MOD;
    z=(z+MOD)%MOD;
    return (x*y%MOD)*z%MOD;
}

int A(int x,int y,int z){
    int res=1;
    for(int i=1;i<=n;++i){
        int a=p[x][i],b=p[y][i],c=p[z][i];
        res*=(mul(a,b,c)+mul(1-a,1-b,1-c));
        res%=MOD;
    }
    return res;
}

int B(int x,int y,int z){
    int res=1;
    for(int i=1;i<=n;++i){
        int a=p[x][i],b=p[y][i],c=p[z][i];
        res*=(mul(a,b,c)+mul(a,b,1-c)+mul(1-a,1-b,c)+mul(1-a,1-b,1-c))%MOD;
        res%=MOD;
    }
    return res%MOD;
}

int C(int x,int y,int z){
    int res=1;
    for(int i=1;i<=n;++i){
        int a=p[x][i],b=p[y][i],c=p[z][i];
        res*=(mul(a,b,c)+mul(a,b,1-c)+mul(a,1-b,c)
        +mul(1-a,1-b,c)+mul(1-a,b,1-c)+mul(1-a,1-b,1-c))%MOD;
        res%=MOD;
    }
    return res%MOD;
}

signed main(){
    cin>>n;
    string s;
    w=ksm(9,MOD-2);
    for(int i=1;i<=3;++i){
        cin>>s;
        for(int j=1;j<=n;++j){
            p[i][j]=(s[j-1]-'0')*w;
        }
    }
    P[1]=A(1,2,3)%MOD;
    P[2]=(B(1,2,3)+B(1,3,2)+B(2,3,1)-3*P[1]%MOD+3*MOD)%MOD;
    P[3]=(C(1,2,3)+C(2,1,3)+C(3,1,2)-2*P[2]%MOD-3*P[1]%MOD+5*MOD)%MOD;
    P[4]=(1-P[1]-P[2]-P[3]+3*MOD)%MOD;
    cout<<(P[1]+2*P[2]+3*P[3]+4*P[4])%MOD; 
    return 0;
} 

注意

题目位置