看着挺吓人的,实际上只需要掌握快速幂就可以解决了

我们先算出1/100%mod的值,可以在测试的时候算出来,这样就不用一步一步每次都算了

接着我们需要算出每个数字的概率,先处理好每个数字都需要什么二极管,然后在运算的时候处理即可(我用的是set处理)

算完每个数字的概率后,看题目有三个要求,但我们只需要看最后一个要求就行了,因为最后一个要求就包含了前两个要求

我们可以进行一个从0到c的循环,a为循环,b=c-a,接着把每个概率加起来就可以了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
const ll Mod=828542813;
ll f(ll a,ll n){
    ll result=1;
    while(n){
        if(n&1) result= (result * a) % mod;
        n >>= 1;
        a = a * a % mod;
    }
    return result%mod;
}
vector<set<int>>a={
    {1,2,3,5,6,7},
    {3,6},
    {1,3,4,5,7},
    {1,3,4,6,7},
    {2,3,4,6},
    {1,2,4,6,7},
    {1,2,4,5,6,7},
    {1,3,6},
    {1,2,3,4,5,6,7},
    {1,2,3,4,6,7}
};
vector<ll>p(10,1);
vector<int>num(7);

ll op(string str){
    int n=str.size();
    int k=4-n;
    ll result=1;
    for(int i=0;i<k;i++){
        result=((result%mod)*(p[0]%mod))%mod;
    }
    for(char ch:str){
        int m=ch-'0';
        result=((result%mod)*(p[m]%mod))%mod;
    }
    return result%mod;
}

int main(){
    int t;
    cin>>t;
    while(t--){
        int c;
        cin>>c;
        for(int i=0;i<7;i++){
            cin>>num[i];                    
        }
        for(int i=0;i<10;i++){
            for(int j=1;j<=7;j++){
                if(a[i].count(j)){
                    
                    p[i]=p[i] * num[j-1] % mod;
                    p[i]=p[i] * Mod % mod;
                }
                else {
                    p[i]=p[i] * (100-num[j-1]) % mod;
                    p[i]=p[i] * Mod % mod;
                }
            }
           
        }
        ll sum=0;
        for(int a=0;a<=c;a++){
            int b=c-a;
            string A=to_string(a);
            string B=to_string(b);
            sum=(sum+op(A)*op(B))%mod;
        }
        cout<<sum<<'\n';
        p.clear();
        p.resize(10,1);
    }
}