玄关求条
查看原帖
玄关求条
1007305
Terry_RE楼主2025/6/21 17:57
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MOD = 998244353;

string s;

int len;

int m;

ll dp[10010][4000][2][2];
// 第pos位,哪些必须出现的数还未出现,前导零,最高位限制
ll sum0[10100];

ll dfs(int pos, int p, int zero, int limits, ll sum){
	if(pos == 0)
		return (p == 0 ? sum : 0);

	if(dp[pos][p][zero][limits] != -1)
		return dp[pos][p][zero][limits];

	ll res(0);

	int limit = limits ? (s[pos] - '0') : 9;

	if(zero){
		res += dfs(pos-1, p, zero, limits && (0 == limit), sum);
		res %= MOD;
	}

	for(int i(zero ? 1 : 0); i <= limit; ++i){
		res += dfs(pos-1, p & ~(1<<i), zero && (i == 0), limits && (i == limit), (sum + sum0[pos] * i % MOD) % MOD);
		res %= MOD;
	}

	return dp[pos][p][zero][limits] = res;
}

int main(){
	cin.tie(0) -> ios::sync_with_stdio(false);

	memset(dp, -1, sizeof dp);

	sum0[1] = 1;
	for(int i(2); i <= 10000; ++i)
		sum0[i] = sum0[i-1] * 10 % MOD; 

	cin >> s;

	len = s.size();

	reverse(s.begin(), s.end());

	s = " " + s;	

	int k(0);

	cin >> m;

	for(int a, i = 1; i <= m; ++i)
		cin >> a, k |= (1<<a);

	cout << dfs(len, k, 1, 1, 0);

	return 0;
}
2025/6/21 17:57
加载中...