题目:给出一个n,计算有多少种方法可以把n表示成若干个回文数的和.
思路:40000以内的回文数只有不到500个,全部预处理出之后就是一个裸的完全背包求方案数的问题了.
代码:
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
#define pq priority_queue
using namespace std;
typedef pair<int,int> pii;
const int maxn = 4e4 + 5, mod = 1e9 + 7;
int f[maxn];
void solve(){
vector<int>cand;
string s, t;
for(int i = 1;i <= 40000;i ++){
s = to_string(i);
t = s;
reverse(t.begin(), t.end());
if(s == t)cand.push_back(i);
}
int sz = cand.size();
f[0] = 1;
for(int i = 1;i <= sz;i ++){
int v = cand[i - 1];
for(int j = v;j <= 40000;j ++)
f[j] = (f[j] + f[j - v]) % mod;
}
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;cin>>t;
solve();
while(t--)
{
int n;
cin >> n;
cout << f[n] << endl;
}
return 0;
}