社区
数据结构与算法
帖子详情
2^n*3^m
flyinfree
2002-04-26 08:20:24
把2^n*3^m (0<=n,m)
的值从小到大排列
求第x项的数
...全文
74
20
打赏
收藏
2^n*3^m
把2^n*3^m (0<=n,m) 的值从小到大排列 求第x项的数
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mathe
2002-05-09
打赏
举报
回复
算法时间复杂度可以为O(x^0.5)
Lawrence444
2002-05-08
打赏
举报
回复
第1500项这种小小的数当然可以直接算啦
DaNiao
2002-05-08
打赏
举报
回复
所谓所有可能的数,我开始时用64位长整型算了1000亿以下的所有符合条件的数
后来发现算到10亿就够了
DaNiao
2002-05-08
打赏
举报
回复
我前几天做了一个类似的题:
http://acm.uva.es/p/v1/136.html
他问的是在序列2^n*3^m*5^k里由小到大第1500个是多少
我用的是一个三重循环,把所有可能的数算出来
然后排序,然后输出第1500个(大约是8亿多)
如果用快速排序可以在2sec内算出
如果用堆(实际上没有进行完全的排序)可以在1ms内算出
我用的是athlon 850
xiongxiao
2002-05-04
打赏
举报
回复
看了这么多我还是一头雾水,是不是我理解能力太差了,现在举个例子:
2^n*3^m的
第5项=?
第6项=?
第10项=?
第11项=?
第12项=?
请各位告知一下答案。
crazy_lazy_pig
2002-05-04
打赏
举报
回复
易知:
2^n1*3^m1 <= 2^n*3^m ( n1<=n , m1<=m ) (1)
又:
当m+n = m0+n0 = k时,2^n0*3^m0 < 2^n*3^m (m0<m) (2)
前两种情况中,比2^n*3^m 小的共:m*n+m-1 个(这里假设n、m不为零)
又: m0+n0<m+n 且 n0>n 时,由上面式子可推出(篇幅限制,不详述)
2^n0*3^m0 < 2^n*3^m (m0<m)
此情况共 (m-1)*(m-2)/2 个(计算步骤略)
另外:m0+n0 > m+n 且 m0>m 时,2^n0*3^m0 > 2^n*3^m (m0<m) (参见(2))
所以只需讨论m0+n0 < m+n 且 m0>m , m0+n0 > m+n 且 m0<m两种情况了。
至此,我们知道:
对于确定的m、n 至少有m*n+m-1 +(m-1)*(m-2)/2 个表达式比2^n*3^m 小。
(待续)
MrYoucheng
2002-05-01
打赏
举报
回复
最简单的方法
求出来排序到数组 然后查询
最快的当然是建立数学模型 求出g(x)与f(n,m)的影射关系
Lawrence444
2002-04-29
打赏
举报
回复
哦,前面说的确实有点问题,搜索的复杂度是O(m^2),不是O(m*n)
xiongxiao
2002-04-29
打赏
举报
回复
希望题目的意思更明确一点,尤其是对 M 的取值问题,如果N与M都可以是无穷大,则当M=0时,N=1/X,2^n*3^m就有最小值为2^1/X。如N只能为自然数,则N=X就行。
但不管M的取值如何,总让它最小就行,谁叫3比2大呢。
Lawrence444
2002-04-29
打赏
举报
回复
有了,我只要取以2为底的对数,得到的对数式就是
n*log2+m*log3(2为底)=n+m*log3(2为底) (我真是不知道怎么写“以2为底的对数!”)
这样的话只需要O(m)的时间就可以找出第x项了。
具体的程序我吃完饭回来写
Lawrence444
2002-04-29
打赏
举报
回复
xiongxiao:
不懂你说的。问题中,N,M肯定是整数,否则这题就没有解的可能。然后,这题明显的,第一项是1,第二项是2,第三项是3,M如果永远取零的话,第三项就是2^2=4了,这是不对的。
wanbaocheng:
我是说:
此题搜索很简单,关键的问题就是当n,m数目较大的时候,程序无法处理这么长的数,所以关键就是要减小原式在n,m都比较大的时候的值,然后就可以搜索了。减小值的工作可以用求对数来进行。
因为,logx < logy =〉 x<y(x,y>0)
又因,n,m>=0时2^n*3^m肯定大于零
可知求2^n*3^m值从小到大排,n,m的序列就等同于求log(2^n*3^m)值从小到大排,n,m的序列。
log(2^n*3^m)=n*log2+m*log3,所以就对这个式子执行搜索就行了。
wanbaocheng
2002-04-29
打赏
举报
回复
TO Lawrence444(胖子):
你好像说的不对,能否再详细说一下你的思路。
Lawrence444
2002-04-28
打赏
举报
回复
我的意思是这样
你的这个式子:2^n*3^m,如果求对数的话就得到
log(2^n*3^m)=n*log2 + m*log3
这样,就只要找到n*log2+m*log3的第x项就行了,这可以用死搜实现,复杂度是O(n*m),也就是O(x)。
也许再想想还可以更快些。
flyinfree
2002-04-28
打赏
举报
回复
是
wanbaocheng
2002-04-28
打赏
举报
回复
(接上)
比如
第1001项的m=36,n=12,用时0.002秒
第1000000项的m=107,n=1055,用时0.2秒
第10000000项的m=1657,n=2506,用时1.8秒
用matlab语言编写的。
请验证。
wanbaocheng
2002-04-28
打赏
举报
回复
首先问一下你那里的m和n是否是自然数(包括零),若是下面就是对的。
我这里有一个算法可以解决你的问题,时间复杂度是O(x)。这样想求出第1000000项在弹指之间。
timepalette
2002-04-27
打赏
举报
回复
#include <stdio.h>
long fromx(int x){
long m,n;
for (m=1;;m++){
n=m;
while (n%2==0) n/=2;
while (n%3==0) n/=3;
if (n==1) if (--x==0) return m;
}
}
void main(){
printf("%d",fromx(10));
}
可能慢了一些(fromx(20)要执行1秒)
楼上说的用对数我不会,期待更快的算法.
flyinfree
2002-04-27
打赏
举报
回复
意思是把能得到的所有值按升序排列
,求第x项
xiongxiao
2002-04-27
打赏
举报
回复
题目有问题,如果N或M我让其中一个永远为0,那答案就太简单了, 好像如此做也没有违背题目的意思.
Lawrence444
2002-04-26
打赏
举报
回复
这题用对数做。
因为如果logx<logy,则x<y。所以对你的这个式子求对数,然后再搜索就行了。
126邮箱页 html源码 单页源码 网站后台登陆界面HTML源码.zip
126邮箱页 html源码 单页源码 网站后台登陆界面HTML源码
武汉开放数据创新大赛——烽火杯文件.zip
武汉开放数据创新大赛——烽火杯文件
mmexport1713881481676.png
mmexport1713881481676.png
Digital currency trading platformAdobeXD源码下载设计素材UI设计.xd
Digital currency trading platform landing pageAdobeXD源码下载设计素材UI设计
了解Java及环境搭建
了解Java及环境搭建
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章