2^n*3^m

flyinfree 2002-04-26 08:20:24
把2^n*3^m (0<=n,m)
的值从小到大排列
求第x项的数

...全文
74 20 打赏 收藏 转发到动态 举报
写回复
用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。所以对你的这个式子求对数,然后再搜索就行了。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧