题意: 一个数字由七个灯管显示,七个灯管为一个显示器,给出8个有同样问题的显示器,给出每个显示器7个管不亮的概率,求前4个显示器和后4个显示器组成的数之和等于C的概率

知识点: 数学,概率论,快速幂

思路: 给出七个灯管的亮灭概率可以求出每个数字出现的概率,有了每个数字出现的概率就能枚举出A+B=C的每一种情况的概率,加起来就是最终的答案,同时我们只需要枚举A从[0,C]的范围即可,枚举每一个A并求B=C-A的B出现的概率。接着一直循环让ans加上A*B即可。

参考代码:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int M=998244353;
int fp(int a,int b){
	int ans=1;
	a%=M;
	while(b>0){
		if(b&1)
			ans=(ans*a)%M;
		a=(a*a)%M;
		b>>=1;
	}
	return ans;
}
signed main()
{
	cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
	int a[10][7]={
	    {1,1,1,0,1,1,1},
	    {0,0,1,0,0,1,0},
	    {1,0,1,1,1,0,1},
	    {1,0,1,1,0,1,1},
	    {0,1,1,1,0,1,0},
	    {1,1,0,1,0,1,1},
	    {1,1,0,1,1,1,1},
	    {1,0,1,0,0,1,0},
	    {1,1,1,1,1,1,1},
	    {1,1,1,1,0,1,1}
	};
	int t;
	cin >> t;
	while(t--){
		int c;
		cin >> c;
		vector<int> p(7);
		vector<int> f(10,1);
		for(int i=0;i<7;i++)
			cin >> p[i];
		for(int i=0;i<10;i++)
			for(int j=0;j<7;j++){
				if(a[i][j])
					f[i]=(f[i]*p[j])%M;
				else
					f[i]=(f[i]*(100-p[j]))%M;
			}
		int a,b,ans=0;
		for(int i=0;i<=c;i++){
			a=(((f[i/1000]*f[i/100%10])%M)*((f[i%100/10]*f[i%10])%M))%M;
			if(a){
				int r=c-i;
				b=(((f[r/1000]*f[r/100%10])%M)*((f[r%100/10]*f[r%10])%M))%M;
				ans=(ans+(a*b)%M)%M;
			}
		}
		ans=ans*fp(fp(100,56),M-2)%M;
		cout << ans << endl;
	}
	return 0;
}