用筛法来筛selfnumber,因为每位数字之和最大等于64,
hash开64位即可。
注意会出现相同的访问。
代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXK = 5001;
int N, K;
int k[MAXK] = {0}, kk[MAXK];
bool hash[64] = {0};
int ans[MAXK] = {0}, tot = 0;
int flag = 1;
void sort(int l, int r)
{
int i = l, j = r, mid = k[l], mid2 = kk[l];
while(i < j)
{
while(i < j && k[j] >= mid) --j;
k[i] = k[j];
kk[i] = kk[j];
while(i < j && k[i] <= mid) ++i;
k[j] = k[i];
kk[j] = kk[i];
}
k[i] = mid;
kk[i] = mid2;
if(i > l) sort(l, i - 1);
if(j < r) sort(j + 1, r);
}
int main()
{
scanf("%d%d", &N, &K);
for(int i = 1; i <= K; ++i)
{
scanf("%d", k + i);
kk[i] = i;
}
sort(1, K);
memset(hash, true, sizeof(hash));
for(int i = 1; i <= N; ++i)
{
if(hash[i % 64])
{
++tot;
while(tot == k[flag] && flag <= K)
ans[kk[flag++]] = i;
}
int tmp = 0, sum = i;
tmp = i;
while(tmp)
{
sum += tmp % 10;
tmp /= 10;
}
hash[sum % 64] = false;
hash[i % 64] = true;
}
printf("%d\n", tot);
for(int i = 1; i <= K; ++i)
printf("%d ", ans[i]);
return 0;
}