Self-numbers 2 - SGU 108
翻译:引自 http://www.cnblogs.com/yylogo/archive/2011/06/09/SGU-108.html
在1949年印度的数学假D.R. Kaprekar发现了一种叫做self-number的经典数字,对于任意正整数n,定义d(n)为n加上n的各个位上的数字(d是数字的意思,Kaprekar发明的一个术语)。如:d(75) = 75 + 7 + 5 = 87。给定任意正整数n,你可以构建出无限的整数递增:n, d(n), d(d(n)), d(d(d(n))), ……举个例子,你从33开始,那么下一个数就是33 + 3 + 3 = 39, 再下一个就是39 + 3 + 9 = 51, 接着就是 51 + 5 + 1 = 57, 那样就生成了一个序列: 33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ... 这里n叫做d(n)的母数 上面的数列中,33是39的母数,39是51的母数,51是57的母数,以此类推……有些数字不止一个母数,比如101有两个母数,91和100。没有母数的数字就叫做self-number。让a[i]成为第i个self-number。现在存在13个小于100的self-number: 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 和 97. (第一个 self-number是a[1]=1, 第二个是 a[2] = 3, :, 第十三个是 a[13]=97);
输入:
包含整数 N, K, s1...sk. (1<=N<=107, 1<=K<=5000) 被空格和换行分割开。
输出:
第一行你必须输出一个数字——表示在[1,n]中self-numbers的个数。第二行必须输出K个数字:a[s1]..a[sk],用空格分开。保证所有的在a[s1]..a[sk]的self-numbers都在[1,n]的区间内,(比如N = 100, sk 就只能等于1..13并且不能等于14, 以为第14个self-number a[14] = 108, 108 > 100)
分析:因为题目给的空间十分的小,所以不能直接开出那么大的数组来进行判断,需要使用一种节约内存的方法,发现每个数的下一个自环数不会比他本身大太多(因为只是加上了本身的位数和),所以使用优先队列不会占用太多的内存,而且还需要注意的是给的查询可能是无序的,需要先排序.....然后输出的时候再排过来。
代码如下:
==========================================================================================================================
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int MAXN = ;
const int oo = 1e9+; struct DATA{
int e, id;
}a[MAXN]; struct Node
{
int e;
Node(int e=):e(e){}
bool operator <(const Node &t)const
{
return e > t.e;
}
}; bool cmp1(DATA t1, DATA t2)
{
return t1.e < t2.e;
}
bool cmp2(DATA t1, DATA t2)
{
return t1.id < t2.id;
} int main()
{
int N, M, cnt=, Arr[MAXN*]={};
priority_queue<Node> Q;
Node s(oo);
Q.push(s); for(int i=; i<; i++)
Arr[i] = Arr[i/] + i%; scanf("%d%d", &N, &M); for(int i=; i<M; i++)
{
scanf("%d", &a[i].e);
a[i].id = i;
}
a[M].e = oo, a[M].id = oo;
sort(a, a+M, cmp1); for(int i=, j=; i<=N; i++)
{
s.e = i+Arr[i%]+Arr[i/]; Q.push(s);
s = Q.top(); if(s.e != i)
{
cnt++;
while(cnt == a[j].e)
a[j++].e = i;
}
while(s.e == i)
{
Q.pop();
s = Q.top();
}
} sort(a, a+M, cmp2);
printf("%d\n", cnt);
for(int i=; i<M; i++)
printf("%d%c", a[i].e, i==M?'\n':' '); return ;
}
Self-numbers 2 - SGU 108的更多相关文章
- 离线 + 位优化 - SGU 108 Self-numbers 2
SGU 108 Self-numbers 2 Problem's Link Mean: 略有这样一种数字:对于任意正整数n,定义d(n)为n加上n的各个位上的数字(d是数字的意思,Kaprekar发明 ...
- sgu 108 Self-numbers II
这道题难在 hash 上, 求出答案很简单, 关键是我们如何标记, 由于 某个数变换后最多比原数多63 所以我们只需开一个63的bool数组就可以了! 同时注意一下, 可能会有相同的询问. 我为了防止 ...
- sgu 108 Self-numbers 2
题意:这样的数有几个? 模仿筛法就能解出,但是内存不够.这就需要重复利用数组,用100大小的数组,所有的数对100取模.对于一个数,比如71,就在arr[78]=71记录下来.到78时,检查78-71 ...
- Python第一个基本教程6章 抽象的
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Type "copyri ...
- SGU 169 numbers 数学
169.Numbers Let us call P(n) - the product of all digits of number n (in decimal notation). For exam ...
- SGU 258 Almost Lucky Numbers 接近幸运数(数位DP)
题意: 定义一个具有2n位的正整数,其前n位之和与后n位之和相等,则为lucky数.给定一个区间,问有多少个正数可以通过修改某一位数从而变成lucky数?注意不能含前导0. 思路: 我的想法是记录那些 ...
- Nearly prime numbers - SGU 113(素数)
题目大意:判断一个数是否是两个素数的乘积,如果是,输出Yes,否则No. 分析:先打表求出来一部分素因子,用素数对素数判定还是比较快的. 代码如下: ========================= ...
- SGU 113.Nearly prime numbers
水一个代码: #include <iostream> using namespace std; int n, a; bool ok; bool prime (int x) { ; i * ...
- SGU 159.Self-Replicating Numbers
时间限制:0.5s 空间限制:6M 题意: 在b(2<b<36)进制中,找到所有长度为n(0<n<2000)的自守数k,满足k^2%b^n=k,字典序输出. ...
随机推荐
- 网上流行的add(2)(3)(4)
网上有很多其他的各样的算法.其实这题就可以用javascript属性arguments.callee来实现,代码如下: function add(x){ var result=0; return fu ...
- SPFA_YZOI 1662: Easy sssp
题目描述 输入数据给出一个有N(2 < = N < = 1,000)个节点,M(M < = 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是 ...
- JqGrid实现自定义查询
$("#jqGridId").setGridParam({url:"数据查询地址"}).trigger("reloadGrid");
- centos7 更改语言
vim /etc/locale.conf 修改 LANG="en_US.UTF-8"
- RecordSet .CacheSize, Properties,CurserType,PageSize
使用 CacheSize 属性可以控制一次要从提供者那里将多少个记录检索到本地内存中.例如,如果 CacheSize 为 10,首次打开 Recordset 对象后,提供者将把前 10 个记录检索到本 ...
- Android Camera拍照 压缩
http://www.linuxidc.com/Linux/2014-12/110924.htm package com.klp.demo_025; import java.io.ByteArrayI ...
- 2016022609 - redis哈希命令集合
参考:http://www.yiibai.com/redis/redis_hashes.html Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的 ...
- 2016022607 - redis配置文件
在Redis有配置文件(redis.conf)可在Redis的根目录下找到.可以通过Redis的CONFIG命令设置所有Redis的配置. Redis的CONFIG命令的基本语法如下所示: redis ...
- Unity与IOS交互
Unity IOS交互 @By 广州小龙 QQ群:63438968 环境:Mac os 10.9.2 Unity 4.2.1f4 Xcode 5.0.2 Unity IOS的交互我写过一个教程 ...
- sublime配置python开发
想在sublime里要python shell那种交互或者run module F5 F5 F5下这种效果的话,还是挺容易实现的,windows下的:1. 打开Sublime text 3 安装pac ...