十分简单,与不要62几乎相同,关键是对驱魔(取模)的运算
re数组于是就显得十分重要。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n;
int b[21];
int re[21];
int dp[21][2][2][14];
int dfs(int pos,int preok,int pre1,int pre13,int num)
{
if(pos==-1)
{
return (!num)&&pre13;
}
if(preok&&dp[pos][pre1][pre13][num]!=-1) return dp[pos][pre1][pre13][num];
int up=preok?9:b[pos],sum=0;
for(int i=0;i<=up;i++)
{
sum+=dfs(pos-1,preok||i<b[pos],i==1,pre13||(i==3&&pre1),(num+re[pos]*i)%13);
}
if(preok) dp[pos][pre1][pre13][num]=sum;
return sum;
}
int solve(int R)
{
int tot=0;
while(R)
{
b[tot++]=R%10;
R/=10;
}
int sum=dfs(tot-1,0,0,0,0);
return sum;
}
int main()
{
memset(dp,-1,sizeof(dp));
re[0]=1;
for(int i=1;i<=21;i++)
re[i]=(re[i-1]*10)%13;
while(~scanf("%d",&n))
{
printf("%d\n",solve(n));
}
}