题目
输入
输出
思路
根据题目要求,可以知道我们要输出的是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 取模。
而小数取模实质就是分式取摸,这里要用到逆元。
逆元
简单理解一下:
例如 (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;
}

京公网安备 11010502036488号