题目要求的是求出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 ",solve(n+1)); 65 return 0; 66 }