看着挺吓人的,实际上只需要掌握快速幂就可以解决了
我们先算出1/100%mod的值,可以在测试的时候算出来,这样就不用一步一步每次都算了
接着我们需要算出每个数字的概率,先处理好每个数字都需要什么二极管,然后在运算的时候处理即可(我用的是set处理)
算完每个数字的概率后,看题目有三个要求,但我们只需要看最后一个要求就行了,因为最后一个要求就包含了前两个要求
我们可以进行一个从0到c的循环,a为循环,b=c-a,接着把每个概率加起来就可以了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
const ll Mod=828542813;
ll f(ll a,ll n){
ll result=1;
while(n){
if(n&1) result= (result * a) % mod;
n >>= 1;
a = a * a % mod;
}
return result%mod;
}
vector<set<int>>a={
{1,2,3,5,6,7},
{3,6},
{1,3,4,5,7},
{1,3,4,6,7},
{2,3,4,6},
{1,2,4,6,7},
{1,2,4,5,6,7},
{1,3,6},
{1,2,3,4,5,6,7},
{1,2,3,4,6,7}
};
vector<ll>p(10,1);
vector<int>num(7);
ll op(string str){
int n=str.size();
int k=4-n;
ll result=1;
for(int i=0;i<k;i++){
result=((result%mod)*(p[0]%mod))%mod;
}
for(char ch:str){
int m=ch-'0';
result=((result%mod)*(p[m]%mod))%mod;
}
return result%mod;
}
int main(){
int t;
cin>>t;
while(t--){
int c;
cin>>c;
for(int i=0;i<7;i++){
cin>>num[i];
}
for(int i=0;i<10;i++){
for(int j=1;j<=7;j++){
if(a[i].count(j)){
p[i]=p[i] * num[j-1] % mod;
p[i]=p[i] * Mod % mod;
}
else {
p[i]=p[i] * (100-num[j-1]) % mod;
p[i]=p[i] * Mod % mod;
}
}
}
ll sum=0;
for(int a=0;a<=c;a++){
int b=c-a;
string A=to_string(a);
string B=to_string(b);
sum=(sum+op(A)*op(B))%mod;
}
cout<<sum<<'\n';
p.clear();
p.resize(10,1);
}
}

京公网安备 11010502036488号