您的位置:首页 > 其它

sgu 108 Self-numbers 2

2012-10-25 10:36 302 查看
题目描述:


108. Self-numbers 2

time limit per test: 1 sec.

memory limit per test: 4096 KB
In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. For any positive integer n, define d(n) to be n plus the sum of the digits of n. (The d stands for
digitadition, a term coined by Kaprekar.) For example, d(75) = 75 + 7 + 5 = 87. Given any positive integer n as a starting point, you can construct the infinite increasing sequence of integers n, d(n), d(d(n)), d(d(d(n))), .... For example, if you
start with 33, the next number is 33 + 3 + 3 = 39, the next is 39 + 3 + 9 = 51, the next is 51 + 5 + 1 = 57, and so you generate the sequence 33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...The number n is called a
generator of d(n). In the sequence above, 33 is a generator of 39, 39 is a generator of 51, 51 is a generator of 57, and so on. Some numbers have more than one generator: for example, 101 has two generators, 91 and 100. A number
with no generators is a self-number. Let the a[i] will be i-th self-number. There are thirteen self-numbers a[1]..a[13] less than 100: 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, and 97. (the first self-number is a[1]=1, the
second is a[2] = 3, :, the thirteen is a[13]=97);
Input
Input contains integer numbers N, K, s1...sk. (1<=N<=107, 1<=K<=5000) delimited by spaces and line breaks.
Output
At first line you must output one number - the quantity of self-numbers in interval [1..N]. Second line must contain K numbers - a[s1]..a[sk], delimited by spaces. It`s a gaurantee, that
all self-numbers a[s1]..a[sk] are in interval [1..N]. (for example if N = 100, sk can be 1..13 and cannot be 14, because 14-th self-number a[14] = 108, 108 > 100)
Sample Input
100 10
1 2 3 4 5 6 7 11 12 13

Sample Output
13
1 3 5 7 9 20 31 75 86 97


卡空间的题,方法就是类似筛法的东西,空间的节约是参考了大牛的博客才知道的。

我们发现位数的和不会超过7*9=63

所以我们只开一个63位的数组表示判断数组,这样会节约很多空间。

具体的实现请看代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<algorithm>
#include<vector>
#include<cstdlib>

#define inf 0xfffffff
#define CLR(a,b) memset((a),(b),sizeof((a)))

using namespace std;
int const nMax = 5001;
typedef int LL;
typedef pair<LL,LL> pij;

bool f1[64],f2[64];
pij ans[nMax];
int n,m;
int k;
int pos;
int p[nMax];

int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d",&ans[i].first);
ans[i].second=i;
}
sort(ans,ans+m);
for(int i=0;i<64;i++)f1[i]=f2[i]=true;
for(int i=1;i<=n;i++){
if(i%64==0){
memcpy(f1,f2,sizeof(f1));
for(int i=0;i<64;i++)f2[i]=true;
}
if(f1[i%64]){
k++;
while(ans[pos].first==k){
p[ans[pos++].second]=i;
}
}
int j=i;
int tem=0;
while(j>0){
tem+=(j%10);
j/=10;
}
if(i%64+tem%64>=64)f2[(i+tem)%64]=false;
else f1[(i+tem)%64]=false;
}
printf("%d\n",k);
for(int i=0;i<m;i++){
if(i==0)printf("%d",p[i]);
else printf(" %d",p[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: