本题只需先求出0-9每一个数字的概率即可,然后A从0遍历到C,算出A每一位数字将概率乘起来,B就是C-A,同样算出每一位数字将概率乘起来,两者概率相乘即可。最后注意分数取模,除法用乘法逆元即可。
附本人ac码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define mod 998244353
const ll N=1e6+10;
ll ksm(ll x, ll y) {
ll res = 1;
while (y) {
if(y & 1) res = res * x % mod;
y >>= 1;
x = x * x % mod;
}
return res;
}
ll inv(ll x) {
return ksm(x, mod - 2);
}
ll a[8],b[10];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int c;
cin>>c;
for(int i=1;i<=7;i++)
{
cin>>a[i];
}
ll x=inv(100000000000000%mod);
b[0]=a[1]*a[2]*a[3]*a[5]*a[6]*a[7]*(100-a[4])%mod*x%mod;
b[1]=a[3]*a[6]*(100-a[1])*(100-a[2])*(100-a[4])*(100-a[5])*(100-a[7])%mod*x%mod;
b[2]=a[1]*a[3]*a[4]*a[5]*a[7]*(100-a[2])*(100-a[6])%mod*x%mod;
b[3]=a[1]*a[3]*a[4]*a[6]*a[7]*(100-a[2])*(100-a[5])%mod*x%mod;
b[4]=a[2]*a[4]*a[3]*a[6]*(100-a[1])*(100-a[5])*(100-a[7])%mod*x%mod;
b[5]=a[1]*a[2]*a[4]*a[6]*a[7]*(100-a[3])*(100-a[5])%mod*x%mod;
b[6]=a[1]*a[2]*a[4]*a[5]*a[6]*a[7]*(100-a[3])%mod*x%mod;
b[7]=a[1]*a[3]*a[6]*(100-a[2])*(100-a[4])*(100-a[5])*(100-a[7])%mod*x%mod;
b[8]=a[1]*a[2]*a[3]*a[4]*a[5]*a[6]*a[7]%mod*x%mod;
b[9]=a[1]*a[2]*a[3]*a[4]*a[6]*a[7]*(100-a[5])%mod*x%mod;
int a1,a2,a3,a4,b1,b2,b3,b4;
ll sum=0;
for(int i=0;i<=c;i++)
{
a1=i/1000;
a2=i/100%10;
a3=i/10%10;
a4=i%10;
b1=(c-i)/1000;
b2=(c-i)/100%10;
b3=(c-i)/10%10;
b4=(c-i)%10;
ll x,y;
x=b[a1]*b[a2]%mod*b[a3]%mod*b[a4]%mod;
y=b[b1]*b[b2]%mod*b[b3]%mod*b[b4]%mod;
sum=(sum+x*y%mod)%mod;
}
cout<<sum<<endl;
}
return 0;
}

京公网安备 11010502036488号