sgu 108 Self-numbers 2
2012-10-25 10:36
302 查看
题目描述:
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
Sample Output
卡空间的题,方法就是类似筛法的东西,空间的节约是参考了大牛的博客才知道的。
我们发现位数的和不会超过7*9=63
所以我们只开一个63位的数组表示判断数组,这样会节约很多空间。
具体的实现请看代码:
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; }
相关文章推荐
- sgu 108-self-numbers 2
- Self-numbers 2 - SGU 108
- sgu 108 Self-numbers 2
- 离线 + 位优化 - SGU 108 Self-numbers 2
- 离线 + 位优化 - SGU 108 Self-numbers 2
- SGU 108 Self-numbers 2(数论)
- sgu 108 self-numbers 2
- SGU 108 Self-numbers 2
- SGU 108 Self-numbers 2 (另一种滚动数组)
- SGU 108 Self-numbers 2
- [SGU 108]Self-numbers II(筛法活用优化+滚动数组)
- SGU 108 Self-numbers II
- SGU 108 Self-numbers II 翻译 题解
- SGU 159 - Self-Replicating Numbers
- sgu159 Self-Replicating Numbers DFS+高精
- sgu159:Self-Replicating Numbers
- SGU 108 Self-numbers II
- leetcode oj java 315. Count of Smaller Numbers After Self
- LeetCode 315.Count of Smaller Numbers After Self
- 分治系列——315. Count of Smaller Numbers After Self[hard]