B-number
题意
输入n
求从 1~n 中又多少存在13又能被13整除的数。
代码
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
//个数,余数,方案数
int dp[20][20][3];
int a[20];
//num 个数 remainder 余数 status 状态
ll dfs(int num, int remainder, int status, int flag) {
//根据需求填写
if (num <= 0) {
return remainder == 0 && status == 2;
}
if (!flag && dp[num][remainder][status] != -1) {
return dp[num][remainder][status];
}
ll ans = 0;
int end = flag ? a[num] : 9;
//主要判断过程
for (int i = 0; i <= end; i++) {
int use = 0;
if (i == 1) {
use = 1;
} else if (status == 1 && i == 3) {
use = 2;
}
if (status == 2) {
use = 2;
}
ans += dfs(num - 1, (remainder * 10 + i) % 13, use, flag && i == end);
}
if (!flag) {
dp[num][remainder][status] = ans;
}
return ans;
}
ll cal(int n) {
int x = n;
memset(dp, -1, sizeof(dp));
int num = 0;
while (x) {
a[++num] = x % 10;
x /= 10;
}
return dfs(num, 0, 0, 1);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
printf("%lld\n", cal(n));
}
return 0;
}