HDU 3652 B-number

来源:互联网 发布:2017淘宝双11销售冠军 编辑:程序博客网 时间:2024/05/17 03:42

B-number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2558    Accepted Submission(s): 1405


Problem Description
A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- string "13" and can be divided by 13. For example, 130 and 2613 are wqb-numbers, but 143 and 2639 are not. Your task is to calculate how many wqb-numbers from 1 to n for a given integer n.
 

Input
Process till EOF. In each line, there is one positive integer n(1 <= n <= 1000000000).
 

Output
Print each answer in a single line.
 

Sample Input
131002001000
 

Sample Output
1122
 

Author
wqb0039
 

Source
2010 Asia Regional Chengdu Site —— Online Contest
解题思路:数位DP,具体见代码
#include <iostream>#include <cstdio>#include <cstring>#define N 11using namespace std;int dp[N][11][15],ten[N];int f[N][11][15],bit[12];//dp[i][j][k]长度为i,首位为j,mod13==k的不含13的数的个数//f[i][j][k]长度为i,首位为j,mod13==k的含13的数的个数void init(){    ten[0]=1;    for(int i=1; i<N; i++)        ten[i]=ten[i-1]*10;    dp[0][0][0]=1;    for(int i=1; i<N; i++)        for(int j=0; j<10; j++)            for(int k=0; k<13; k++)                for(int a=0; a<10; a++)                {                    int b=(ten[i-1]*a+k)%13;                    f[i][a][b]+=f[i-1][j][k];                    if(a==1 && j==3)f[i][a][b]+=dp[i-1][j][k];                    else dp[i][a][b]+=dp[i-1][j][k];                }}int calc(int x){    if(x<13)return 0;    int m=0;    while(x)    {        bit[++m]=x%10;        x/=10;    }    int res=0,last=0,sum=0,kk;    bool flag=false;    for(int i=m; i>0; i--)    {        for(int j=0; j<bit[i]; j++)            for(int k=0; k<13; k++)            {                kk=(sum+k)%13;                if(kk==0)                {                    res+=f[i][j][k];                    if(flag)                        res+=dp[i][j][k];                    if(!flag && j==3 && last==1)                        res+=dp[i][j][k];                }            }        if(bit[i]==3 && last==1)flag=true;        last=bit[i];        sum+=bit[i]*ten[i-1];    }    return res;}int main(){    init();    int n;    while(scanf("%d",&n)!=EOF)    {        printf("%d\n",calc(n+1));    }    return 0;}


0 0
原创粉丝点击