LINK
题目:
大致翻译:
一个数字由数字回文串相加,问有多少种组合情况。
思路:
由完全背包可得:
d
p
[
i
]
[
j
]
:
dp[i][j]:
dp[i][j]:前
i
i
i个物品随意取,组成总体积为
j
j
j的方法数。 由此思路可得前
i
i
i个回文数里,相加之和为
j
j
j的方法数。 再转换为一维可得: 转换公式为:
dp[j]=(dp[j]+dp[j-v[i]])%mod;
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
const int NB=64;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
vector<int>v;
void init(){
string s,ss;
for(int i=0;i<=4e4;i++){
s=ss=to_string(i);
reverse(s.begin(),s.end());
if(s==ss){
v.push_back(i);
}
}
}
int dp[N];
signed main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
init();
dp[0]=1;
for(int i=1;i<v.size();i++){
for(int j=v[i];j<=4e4;j++){
dp[j]=(dp[j]+dp[j-v[i]])%mod;
}
}
int t,n;cin>>t;
while(t--){
cin>>n;
cout<<dp[n]<<endl;
}
return 0;
}
|