2 条题解
-
0
AC题解:
#include <bits/stdc++.h> using namespace std; long long f[11][2][10][2], cnt[11][2][10][2], ten[11] = {1}; bool vis[11][2][10][2]; int a[11]; void init() { for (int i = 1; i < 11; i++) ten[i] = ten[i-1] * 10; } long long dfs(int p, bool zero, int pre, bool limit) { if (p == 0) { int up = limit ? a[p] : 9; f[p][zero][pre][limit] = (1 + up) * up / 2; cnt[p][zero][pre][limit] = 1 + up; if (!zero && pre <= up) { f[p][zero][pre][limit] -= pre; cnt[p][zero][pre][limit]--; } return f[p][zero][pre][limit]; } if (vis[p][zero][pre][limit]) return f[p][zero][pre][limit]; vis[p][zero][pre][limit] = true; int up = limit ? a[p] : 9; for (int i = 0; i <= up; i++) { if (!zero && i == pre) continue; dfs(p-1, zero && !i, i, limit && i == up); f[p][zero][pre][limit] += f[p-1][zero && !i][i][limit && i == up] + i * ten[p] * cnt[p-1][zero && !i][i][limit && i == up]; cnt[p][zero][pre][limit] += cnt[p-1][zero && !i][i][limit && i == up]; } return f[p][zero][pre][limit]; } long long cal(int num) { memset(cnt, 0, sizeof cnt); memset(f, 0, sizeof f); memset(vis, 0, sizeof vis); int p = 0; for (; num; a[p++] = num % 10, num /= 10) ; return dfs(p-1, true, 0, true); } int main() { init(); int l, r; cin >> l >> r; cout << (long long) (l + r) * (r - l + 1) / 2 - cal(r) + cal(l-1) << endl; return 0; } -
0
WA代码:
#include <bits/stdc++.h> using namespace std; long long f[11][2][10][2], cnt[11][2][10][2], ten[11] = {1}; bool vis[11][2][10][2]; int a[11]; void init() { for (int i = 1; i < 11; i++) ten[i] = ten[i-1] * 10; } long long dfs(int p, bool zero, int pre, bool limit) { if (p == 0) { int up = limit ? a[p] : 9; f[p][zero][pre][limit] = (1 + up) * up / 2; cnt[p][zero][pre][limit] = 1 + up; return f[p][zero][pre][limit]; } if (vis[p][zero][pre][limit]) return f[p][zero][pre][limit]; vis[p][zero][pre][limit] = true; int up = limit ? a[p] : 9; for (int i = 0; i <= up; i++) { if (!zero && i == pre) continue; dfs(p-1, zero && !i, i, limit && i == up); f[p][zero][pre][limit] += f[p-1][zero && !i][i][limit && i == up] + i * ten[p] * cnt[p-1][zero && !i][i][limit && i == up]; cnt[p][zero][pre][limit] += cnt[p-1][zero && !i][i][limit && i == up]; } return f[p][zero][pre][limit]; } long long cal(int num) { memset(cnt, 0, sizeof cnt); memset(f, 0, sizeof f); int p = 0; for (; num; a[p++] = num % 10, num /= 10) ; return dfs(p-1, true, 0, true); } int main() { init(); int l, r; cin >> l >> r; cout << (long long) (l + r) * (r - l + 1) / 2 - cal(r) + cal(l-1) << endl; return 0; }
- 1
信息
- ID
- 41
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 4
- 上传者