B-number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8578 Accepted Submission(s): 5088
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
13
100
200
1000
Sample Output
1
1
2
2
Author
wqb0039
Source
2010 Asia Regional Chengdu Site —— Online Contest
#include <bits/stdc++.h>
using namespace std;
int ch[20];
int dp[20][2][2][20];
int dfs(int pos, bool in, bool pre, int mod, bool limit)
{
if (pos == 0)
return (in && mod == 0) ? 1 : 0;
if (!limit && dp[pos][in][pre][mod])
return dp[pos][in][pre][mod];
int res = 0;
int up = limit ? ch[pos] : 9;
for (int i = 0; i <= up; i++)
{
/// 将当前数 % 13 传递,类似列竖式。。
if (pre && i == 3)
res += dfs(pos - 1, 1, 0, (mod * 10 + i) % 13, limit && i == up);
else
res += dfs(pos - 1, in, i == 1, (mod * 10 + i) % 13, limit && i == up);
}
if (!limit)
dp[pos][in][pre][mod] = res;
return res;
}
int solve(int n)
{
int cnt = 0;
while (n > 0)
{
ch[++cnt] = n % 10;
n /= 10;
}
return dfs(cnt, 0, 0, 0, 1);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int n;
while (~scanf("%d", &n))
printf("%d\n", solve(n));
return 0;
}