思路:
这道题用数位DP
首先是整除13,我们设一个res,表示当前除13的余数,然后每次计算一下就行
然后就是包含13,我们设一个op,0代表没有1或3,1代表有1无3,2代表有13,详见代码
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[101];
int f[100][14][3];
int check(int now, int op)
{
if(op==0)
if(now==1)
return 1;
else
return 0;
if(op==1)
if(now==3)
return 2;
else if(now==1)
return 1;
else return 0;
else
return 2;
}
int dfs(int pos, int res, int op, int limit)
{
if(!limit&&f[pos][res][op]!=-1)
return f[pos][res][op];
if(pos==0)
return res==0 && op==2;
int up=limit ? a[pos] : 9, ans=0;
for(int i=0; i<=up; i++)
ans+=dfs(pos-1, (res*10+i)%13, check(i, op), limit && i==up);
if(!limit)
f[pos][res][op]=ans;
return ans;
}
int part(int x)
{
int pos=0;
while(x!=0)
{
a[++pos]=x%10;
x=x/10;
}
return dfs(pos, 0, 0, 1);
}
int main()
{
while(cin>>n)
{
memset(f, -1, sizeof(f));
printf("%d\n", part(n));
}
return 0;
}