题目链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370521
用类似数位dp的思想去枚举每个状态,记录每个数字的出现次数,当后面的数组可以任意填时,就枚举答案,枚举每个数字的在后面的出现次数,做背包转移。有个细节是要考虑前导零。
设数字的长度为n,复杂度大概是n*10*O(dp转移的复杂度), ,实际上还要除一些常数,感觉大概可以过。
所以先写了一发,剪枝也一直T的代码。
后面把9,99,999...这样的数字的答案打表预处理,就不用考虑前导0的情况,复杂度大概能除2,不做剪枝大概也可以过....
#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
using namespace std;
typedef long long ll;
const int MAXN=(int)1e5+5;
const int MOD=(int)1e9+7;
string s;
int a[55],n;
ll comb[55][55];
int dp[55],tmp[55];
int ti[10];
ll ans;
int tbl[]=