题意:找出< n 是13的倍数且含有‘13’的个数;
与hdu2089 多了一维余数的状态,其它相似
dp[i][j][k]:表示前i 为 余数为j 状态为k的个数;
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
#define ll __int64
int a[100];
int dp[100][15][3];
int dfs(int pos, int st, int mod, bool flag)
{
if(pos==0)
return (st==2&&mod==0);
if(flag&&dp[pos][mod][st]!=-1)
return dp[pos][mod][st];
int ans=0;
int u=flag?9:a[pos];
for(int i=0;i<=u;i++)
{
if(st==2||(st==1&&i==3))
ans+=dfs(pos-1,2,(mod*10+i)%13,flag||i<u);
else if(i==1)
ans+=dfs(pos-1,1,(mod*10+i)%13,flag||i<u);
else
ans+=dfs(pos-1,0,(mod*10+i)%13,flag||i<u);
}
if(flag) dp[pos][mod][st]=ans;
return ans;
}
int cal(int n)
{
int len=0;
while(n)
{
a[++len]=n%10;
n/=10;
}
return dfs(len,0,0,0);
}
int main()
{
int t;
memset(dp,-1,sizeof(dp));
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%Id\n",cal(n));
}
return 0;
}