题目要求的是求出1~n里能被13整除且含有“13"的数字的个数。。。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 int dp[15][10][14][3],md[15]={
 6     0,1
 7 };
 8 void init()
 9 {
10     for(int i=2;i<11;i++)
11         md[i]=(md[i-1]*10)%13;
12     memset(dp,0,sizeof(dp));
13     for(int i=0;i<10;i++)
14         dp[1][i][i][0]=1;
15     dp[1][3][3][1]=1;
16     for(int i=2;i<11;i++)
17     for(int j=0;j<13;j++)
18     for(int k=0;k<13;k++){
19         dp[i][j][k][0]=0;
20         dp[i][j][k][1]=0;
21         dp[i][j][k][2]=0;
22         int tmp=(j*md[i])%13;
23         for(int j0=0;j0<10;j0++){
24                 
25                 dp[i][j][k][0]+=dp[i-1][j0][(13+k-tmp)%13][0];
26                 if(j==1&&j0==3)
27                     dp[i][j][k][0]-=dp[i-1][j0][(13+k-tmp)%13][1];
28                 dp[i][j][k][2]+=dp[i-1][j0][(13+k-tmp)%13][2];
29                 if(j==1&&j0==3)
30                     dp[i][j][k][2]+=dp[i-1][3][(13+k-tmp)%13][1];
31                 if(j==3)
32                 dp[i][j][k][1]=dp[i][j][k][1]+dp[i-1][j0][(13+k-tmp)%13][0];
33         }
34     }    
35 }
36 int solve(int x)
37 {
38     int ans=0,dig[15],flag=0,cnt=0;
39     while(x){
40         dig[++cnt]=x%10;
41         x/=10;
42     }
43     int pre=0,tmp;
44     dig[cnt+1]=0;
45     for(int i=cnt;i>=1;i--){
46         pre=(pre+dig[i+1]*md[i+1])%13;
47         for(int j=0;j<dig[i];j++){
48             if(flag)
49                 ans+=dp[i][j][(13-pre)%13][0];    
50             ans+=dp[i][j][(13-pre)%13][2];
51             if(j==3&&dig[i+1]==1&&flag==0)
52             ans+=dp[i][j][(13-pre)%13][1];
53         }
54         if(dig[i]==3&&dig[i+1]==1)
55             flag=1;
56     }
57     return ans;
58 }
59 int main()
60 {
61     init();
62     int n;
63     while(~scanf("%d",&n))
64         printf("%d\n",solve(n+1));
65     return 0;
66 }
AC Code