题目 alt 输入 alt 输出 alt 思路

根据题目要求,可以知道我们要输出的是A+B=C的概率,就等价与数组A的概率乘以数字B的概率。

因为C已知,所以B的概率就可以表示为(C-A),而显然A是小于C的,所以可以通过对A的遍历,来得出所有满足情况的概率,将每个概率加起来就是我们要的答案。

因为每个灯管亮的概率相互独立,所以可以算出0到9每个数字出现的概率。

设pi表示1到7灯管亮的概率,qi表示1到7灯管不亮的概率,

那么1出现的概率就是:p[1] * p[2]* p[3]* q[4]* p[5]*p[6]*p[7]。

因为最后要输出一个整数,而概率是存在小数的,所以概率要对998244353 取模。

而小数取模实质就是分式取摸,这里要用到逆元。

逆元

alt 简单理解一下:

例如 (ab)%7=a%7b%7

而(a/b)%7!=a%7/b%7

但(a/b)可以视为(a*1/b)

所以我们只要找到1/b的整数等价形式,就可以用乘法的取模运算了。

由费马小定理可知:(a/b)%7=a*b的(7-2)次方%7,即在模m的情况下(1/b)等价于b的(m-2)次方。

题目中m=998244353,导致b的次方特别大,所以要用到快速幂函数如下。

long long ksm(long long x,int base=100){

long long ans=1;
while(x){
    if(x & 1){
        ans=ans*base%mod;
    }
    base=base*base%mod;
    x >>= 1;
}
return ans;

}

其中x是指数,base是底数。

完整代码

```#include<bits/stdc++.h>
#define int long long
using namespace std;
long long p[8];
long long q[8];
const int mod=998244353;
long long ksm(long long x,int base=100){
    long long ans=1;
    while(x){
        if(x & 1){
            ans=ans*base%mod;
        }
        base=base*base%mod;
        x >>= 1;
    }
    return ans;
}

int num(int n){
    if(n==0) return p[1] * p[2]%mod* p[3]%mod* q[4]%mod* p[5]%mod*p[6]%mod*p[7]%mod;
    if(n==1) return q[1]*q[2]%mod*p[3]%mod*q[4]%mod*q[5]%mod*p[6]%mod*q[7]%mod;
    if(n==2) return p[1]*q[2]%mod*p[3]%mod*p[4]%mod*p[5]%mod*q[6]%mod*p[7]%mod;
    if(n==3) return p[1]*q[2]%mod*p[3]%mod*p[4]%mod*q[5]%mod*p[6]%mod*p[7]%mod;
    if(n==4) return  q[1] *p[2]%mod*p[3]%mod*p[4]%mod* q[5]%mod*p[6]%mod* q[7]%mod;
    if(n==5) return p[1]*p[2]%mod* q[3]%mod*p[4]%mod* q[5]%mod*p[6]%mod*p[7]%mod;
    if(n==6) return p[1]*p[2]%mod* q[3]%mod*p[4]%mod*p[5]%mod*p[6]%mod*p[7]%mod;
    if(n==7) return p[1]* q[2]%mod*p[3]%mod* q[4]%mod* q[5]%mod*p[6]%mod* q[7]%mod;
    if(n==8) return p[1]*p[2]%mod*p[3]%mod*p[4]%mod*p[5]%mod*p[6]%mod*p[7]%mod;
    if(n==9) return p[1]*p[2]%mod*p[3]%mod*p[4]%mod* q[5]%mod*p[6]%mod*p[7]%mod;
    return 0;
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        int c;
        cin>>c;
        for(int i=1;i<=7;i++){
            cin>>p[i];
            q[i]= (100-p[i]) * ksm(mod-2) %mod;
            p[i]= p[i] * ksm(mod-2) %mod;
            
        }
       
        int ans1=0;
        for(int i=0;i<=c;i++){
            int A=i; int B=(c-i) ;int cnt=0; long long ans=1;//A可能不是4位数,cnt是为了算前导0的数量
            while(A){
                ans=ans*num(A%10)%mod;
                A /= 10;
                cnt++;
            }
            ans=ans * ksm(4-cnt,num(0)) %mod;
          
            cnt=0;
            while(B){
                ans= ans* num (B%10) %mod;
                B/=10;
                cnt++;
            }
            ans=ans*ksm(4-cnt,num(0))%mod; 
            
            ans1=(ans1+ans)%mod;
            
        }
       cout<<ans1<<endl;
        
    }
    return 0;
}