社区
数据结构与算法
帖子详情
2^n*3^m
flyinfree
2002-04-26 08:20:24
把2^n*3^m (0<=n,m)
的值从小到大排列
求第x项的数
...全文
96
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。所以对你的这个式子求对数,然后再搜索就行了。
141整式的乘法(第1课时).ppt
4) 3 * m * n * m * n - 5 * m * n * m * n。这些问题旨在训练学生的多项式乘法技巧,特别是当涉及到合并同类项时。 探究1则可能是一个开放性问题,鼓励学生应用所学知识解决更复杂或抽象的乘法问题。 总的来说,...
1413积的乘方课件.ppt
8. **综合应用**:在解决复杂表达式的乘方运算时,需要运用以上规则,如例题中的 `(a^3 * a^4 * a) + (a^2)^4 + (-2a^4)^2` 或 `(2(x^3)^2 * x^3) - (3x^3)^3 + (5x)^2 * x^7`。 9. **指数幂的合并**:在合并类似项...
141整式的乘法PPT学习教案.pptx
最后,通过一系列的计算练习,比如6*a^2, 2^5 * x^5, 和3*m*x^10等,以及判断题和计算题,来巩固和应用所学知识。 总结起来,本节课的核心内容包括: 1. 同底数幂的概念和乘法运算的引入。 2. 探索和推导同底数幂...
上海市沪教版(五四制)七年级第一学期9.6整式的除法导学案.pdf
1. 计算 `(6^2)/(2^2)`、`(4^3)/(3^3*a^x)*a^x`、`(2^1)/(x^2)`、`(3^1 * 2^1)/(2^2 * n^m * n^m)`、`(1/2)^2 * (2/5)^2 * (5/5)^2 * m^m` 和 `(7/6 * 3/2 * y/x * x/y)^2`。 2. 计算 `(10^3)/(21 * 21)` 和 `(2^3 -...
同底数幂的乘法、幂的乘方与积的乘方练习2分享.pdf
2. 幂的乘方法则:`(a^m)^n = a^{m*n}`。这表示幂的幂,即底数不变,指数相乘。逆向运用这个规则,可以将指数分解成两个乘积的形式。 3. 积的乘方法则:`(ab)^n = a^n * b^n`。对于一个积的幂,你需要对每个因式...
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章