题目的意思就是让你求出 [ 1 , n ] [1, n] [1,n] 之间的自我数,自我数指的是无法用 另一个数字 加上 这个数字的数字和 的和来得出。
首先可以想到暴力,从小到大枚举 [ 1 , n ] [1, n] [1,n] 所有的数,然后算出数字和并标记。最后没有被标记的数就是我们要求的自我数。
那么现在问题来了,大小为
1
0
7
10^7
107 的 bool 数组需要消耗大约
9.5
9.5
9.5 MB 的内存,而题目要求是
6
6
6 MB。那么只能用 bitset
,这样可以直接将空间优化到
9.5
÷
8
9.5 \div 8
9.5÷8 MB,就可以了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[5007];
bitset<10000107> st;
int x[1000007], cnt = 0;
int main() {
cin >> n >> k;
for(int i = 1; i <= k; i++) cin >> a[i];
for(int i = 1; i <= n; i++) {
if(st[i] == 0) x[++cnt] = i;
int t = i, sum = 0;
while(t > 0) {
sum += t % 10;
t /= 10;
}
st[i + sum] = 1;
}
// for(int i = 1; i <= cnt; i++) cout << x[i] << " ";
// cout << "\n";
cout << cnt << "\n";
for(int i = 1; i <= k; i++) {
cout << x[a[i]] << " ";
}
return 0;
}