HDU

来源:互联网 发布:我的世界泰拉瑞亚js 编辑:程序博客网 时间:2024/05/22 05:11

题目链接 : 杭电3652

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
题意:输入n,求1到n有多少个数是b数~即能被13整除且含有13字符串


#include<stdio.h>#include<iostream>#include<set>#include<math.h>#include<algorithm>#include<string.h>#include<string>#include<queue>#include<vector>using namespace std;#define long long llconst int inf = 0x3f3f3f3f;int dp[15][15][3];int digt[15];///0表示不含13,1表示不含13但是末尾是1,2表示包含13int dfs(int pos , int mod , int flag , bool limit) {    if(pos < 0)        return flag == 2 && mod == 0;    if(!limit && dp[pos][mod][flag] != -1)        return dp[pos][mod][flag];    int prepos = limit ? digt[pos] : 9;    int ans = 0 ;    for(int i =0 ; i <= prepos ; i ++) {        int nowmod = (mod * 10 + i)%13;        int nowflag = flag;        if(flag == 1 && i == 3) {            nowflag = 2;        }        else if(flag == 0 && i == 1) {            nowflag = 1;        }        else if(flag == 1 && i != 3 && i != 1) {            nowflag = 0;        }        ans += dfs(pos - 1 , nowmod , nowflag , limit && i == prepos);    }    if(!limit)        dp[pos][mod][flag] = ans;    return ans;}int solve(int x) {    memset(digt , 0 , sizeof(digt));    int k = 0;    while(x) {        digt[k++] = x % 10;        x /= 10;    }    return dfs(k - 1 , 0 , 0 , 1);}int main(){    memset(dp , -1 , sizeof(dp));    int n ;    while(~scanf("%d" , &n)) {        printf("%d\n" , solve(n));    }    return 0;}







原创粉丝点击