3 条题解
-
0
代码(暂时有问题):
#include <bits/stdc++.h> using namespace std; int a[11], cnt[33], m; bool vis[33][33][2]; int f[33][33][2]; // 到第p位,还需要有 x 位为 1,且 limit int dfs(int p, int x, bool limit) { if (x == 0) return 1; if (p == -1) return 0; if (vis[p][x][limit]) return f[p][x][limit]; vis[p][x][limit] = true; int up = limit ? a[p] : 1; for (int i = 0; i <= up; i++) f[p][x][limit] += dfs(p-1, x-i, limit && i == up); return f[p][x][limit]; } int cal(int num, int x) { memset(vis, 0, sizeof vis); memset(f, 0, sizeof f); int p = 0; for (; num; a[p++] = num % 2, num /= 2); return dfs(p-1, x, true); } int main() { int n; cin >> n; for (int i = 1; i <= 30; i++) { cnt[i] = cal(n, i); if (cnt[i]) m = i; } for (int i = 1; i <= m; i++) cout << cnt[i] << endl; return 0; } -
0
暴力 TLE:
#include <bits/stdc++.h> using namespace std; int a[11], cnt[33], m; void dfs(int p, int x, bool limit) { if (p == -1) { cnt[x]++; m = max(m, x); return; } int up = limit ? a[p] : 1; for (int i = 0; i <= up; i++) { dfs(p-1, x+i, limit && i == up); } } void cal(int num) { int p = 0; for (; num; a[p++] = num % 2, num /= 2); dfs(p-1, 0, true); } int main() { int n; cin >> n; cal(n); for (int i = 1; i <= m; i++) cout << cnt[i] << endl; return 0; }
- 1
信息
- ID
- 40
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 9
- 已通过
- 3
- 上传者