题意: 一个数字由七个灯管显示,七个灯管为一个显示器,给出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;
}

京公网安备 11010502036488号