題目大意:求區間[0,n]有幾個數中間的位數有13並且這個數能夠被13整除;
題目解析:跟上題一樣。只不過因爲要整除13所以dp多了一維表示當前位數模13的餘數;
AC代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int dp[12][3][14];
int n,num[12];
int dfs(int pos,int pre,int mod,bool limit)
{
if(pos==-1) return pre==2&&mod==0;
if(!limit&&dp[pos][pre][mod]!=-1) return dp[pos][pre][mod];
int u=limit?num[pos]:9;
int ans=0;
for(int i=0;i<=u;i++)
{
if(pre==2)
ans+=dfs(pos-1,2,(mod*10+i)%13,limit&&i==u);
else if(pre==1&&i==3)
ans+=dfs(pos-1,2,(mod*10+i)%13,limit&&i==u);
else if(i==1)
ans+=dfs(pos-1,1,(mod*10+i)%13,limit&&i==u);
else ans+=dfs(pos-1,0,(mod*10+i)%13,limit&&i==u);
}
if(!limit) return dp[pos][pre][mod]=ans;
return ans;
}
int solve(int n)
{
int cnt=0;
while(n)
{
num[cnt++]=n%10;
n/=10;
}
return dfs(cnt-1,0,0,true);
}
int main()
{
memset(dp,-1,sizeof(dp));
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",solve(n));
}
return 0;
}