【HDU3652】【B-number】

来源:互联网 发布:乐视电视连不上网络 编辑:程序博客网 时间:2024/05/29 10:15

B-number

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


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
 

Recommend
lcy


#include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;ll dp[25][10][13][2]; // 0:ll bits[25];ll dfs(ll pos,ll p,ll mod,bool ok,bool flag){if(pos <= 0) return (mod == 0 && ok) ? 1 : 0; if(!flag && ~dp[pos][p][mod][ok]) return dp[pos][p][mod][ok];ll end = flag ? bits[pos] : 9;ll res = 0;for(int i=0;i<=end;i++){ll tmp = (mod*10 + i) % 13;//tmp = (13 - tmp) % 13;res += dfs(pos-1,i,tmp,ok || (p == 1 && i == 3),flag && (i==end));}return flag ? res : dp[pos][p][mod][ok] = res;}ll solve(ll x){ll cur = 0;ll tt =x ;while(tt > 0){bits[++cur] = tt % 10;tt /= 10;}return dfs(cur,0,0,0,1);}int main(){ll n;memset(dp,-1,sizeof(dp));while(scanf("%I64d",&n) != EOF){printf("%I64d\n",solve(n));}return 0;}


0 0
原创粉丝点击