zoukankan      html  css  js  c++  java
  • hdu 3652 B-number

    题目要求的是求出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 }
    AC Code
  • 相关阅读:
    一个网络狂人的财富轨迹
    婚姻的精髓
    软件史上最伟大的十大程序员
    由瓜子理论引出的人力资源管理启示
    感情裂缝的"维修工" 在生活抛锚的地方起航
    寻找更新过的数据
    asp.net mvc中TempData和ViewData的区别
    SQL Server Backup
    VS字符串时间转换用法
    SQL Server 根据动态条件insert,update语句
  • 原文地址:https://www.cnblogs.com/kim888168/p/3252755.html
Copyright © 2011-2022 走看看