sgu108:Self-numbers II

来源:互联网 发布:阶级和阶层 知乎 编辑:程序博客网 时间:2024/06/06 00:24

用筛法来筛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;}

0 0
原创粉丝点击