DP以前专属,,,,一直没咋碰,,,,,数位DP都很不会了= =
数字里含有13且能被13整除的数字不要
#include <iostream>
#include <cstdio>
using namespace std;
const int V = 10;
const int mod = 13;
int dp[V][mod][3],a;
int MOD[V];
int init()
{
MOD[1] = 1;
for(int i=2;i<V;i++)
{
MOD[i] = (MOD[i-1]*10)%mod;
}
dp[0][0][0] = 1;
for(int j=0;j<=9;j++)
{
dp[1][j][0] = 1;
}
dp[1][3][1]=1;
for(int i=1;i<V-1;i++)
{
for(int j=0;j<mod;j++)
{
for(int k=0;k<=9;k++)
{
int temp=(j+k*MOD[i+1])%mod;
dp[i+1][temp][0]+=dp[i][j][0];
dp[i+1][temp][2]+=dp[i][j][2];
if(k==1)
{
dp[i+1][temp][0]-=dp[i][j][1];
dp[i+1][temp][2]+=dp[i][j][1];
}
if(k==3)
{
dp[i+1][temp][1]+=dp[i][j][0];
}
}
}
}
}
int f(int a)
{
int bit[V],top = 0;
int ans = 0;
while(a)
{
bit[++top] = a%10;
a /= 10;
}
bool flag = false;
int pre=0;
for(int i=top;i>=1;i--)
{
for(int j=0;j<bit[i];j++)
{
int temp=(13-(pre*10+j)*MOD[i]%mod)%mod;
ans+=dp[i-1][temp][2];
if(flag||j==3&&pre%10==1)
{
ans+=dp[i-1][temp][0];
}
else if(j==1) ans+=dp[i-1][temp][1];
}
pre=(pre*10)+bit[i];
if(i!=top&&bit[i+1]==1&&bit[i]==3) flag=true;
}
return ans;
}
int main()
{
init();
while(scanf("%d",&a)!=EOF)
{
printf("%d\n",f(a+1));
}
return 0;
}