题意:
给定n,问[1,n]中有多少个数包含子串13,且模13等于0.
数据范围:n<=1e9
解法:
数位dp.
定义状态d[len][last][f][mod]为:
1.剩余长度len.
2.上一个数字为last.
3.是否已经有子串13.
4.模13等于mod.
的方案数.
定义出状态之后,剩下的就是基本的数位dp流程了.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int d[20][10][2][14];
int digit[20];
int n;
int dfs(int len,int limit,int last,int f,int mod){
if(!len)return f==1&&mod==0;
if(!limit&&d[len][last][f][mod]!=-1)return d[len][last][f][mod];
int ans=0;
int ma=(limit?digit[len]:9);
for(int i=0;i<=ma;i++){
ans+=dfs(len-1,limit&&i==ma,i,f|(last==1&&i==3),(mod*10+i)%13);
}
if(!limit)d[len][last][f][mod]=ans;
return ans;
}
int solve(int x){
int len=0;
while(x){
digit[++len]=x%10;
x/=10;
}
return dfs(len,1,-1,0,0);
}
signed main(){
ios::sync_with_stdio(0);
memset(d,-1,sizeof d);
while(cin>>n){
int ans=solve(n);
cout<<ans<<endl;
}
return 0;
}