ural 1748 The Most Complex Number 和 丑数
题目:http://acm.timus.ru/problem.aspx?space=1&num=1748
题意:求n范围内约数个数最多的那个数。
Roughly speaking, for a number to be highly composite it has to have prime factors as small as possible, but not too many of the same. If we decompose a number n in prime factors like this:
where are prime, and the exponents
are positive integers, then the number of divisors of n is exactly
Hence, for n to be a highly composite number,
- the k given prime numbers pi must be precisely the first k prime numbers (2, 3, 5, ...); if not, we could replace one of the given primes by a smaller prime, and thus obtain a smaller number than n with the same number of divisors (for instance 10 = 2 × 5 may be replaced with 6 = 2 × 3; both have four divisors);
- the sequence of exponents must be non-increasing, that is
; otherwise, by exchanging two exponents we would again get a smaller number than n with the same number of divisors (for instance 18 = 21 × 32 may be replaced with 12 = 22 × 31; both have six divisors).
c++ 代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
ll n, ansa, ansb;
int p[] = {, , , , , , , , , , , , , , }; void dfs(int pos, ll num, int div, int limit )
{
if ( div>ansb || (div==ansb && num<ansa) ){
ansa = num; ansb = div;
}
if (pos == ) return ; for ( int i=; i<=limit; ++i )
{
if ( n/num < p[pos]) break;
num *= p[pos];
dfs(pos+, num, div*(i+), i);
}
} int main(int argc, char**argv)
{
int T; scanf("%d", &T);
while ( T-- ){
//scanf("%lld", &n);
cin >> n;
if (n==) {
puts("1 1"); continue;
}
ansa = ansb = -;
dfs(, , , );
//printf("%lld %lld\n", ansa, ansb);
cout << ansa << ' ' << ansb << endl;
}
return EXIT_SUCCESS;
}
python 代码 注意这代码会TLE,具体是什嘛原因,我没有具体查了。貌似测试10^18都很快的。
p= [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
ansa=0; ansb=0 def dfs(pos, num, div, limit, n):
global ansa, ansb
if div>ansb or ( div==ansb and ansa>num ):
ansa = num; ansb = div
if pos == 15: return for i in xrange(1, limit+1):
if (n/num) < p[pos] : return
num *= p[pos]
dfs(pos+1, num, div*(i+1), i, n) if __name__ == '__main__':
T = input()
while T:
T -= 1
n = input()
if n == 1:
print 1, 1; continue
ansa = ansb = -1
dfs(0, 1, 1, 60, n)
print ansa, ansb
这种数有点类似与丑数,对于丑数的求法。
丑数:因子只含2,3,5的数。 例如求第n个丑数。
bruteforce 是有用的。效率太低了。
如果有一个丑数数组,那么这个数组接下来一个丑数会是哪个数呢?毫无疑问这个数是有数组里的元素乘上2,3,5里的某一个数,这个数满足大于当前丑数数组最后一个元素,最小的满足这个条件的数就是下一个丑数。即求min( 2*a, 3*b, 5*c ) ,枚举求2a,3b5c是可行的。但二分会是很不错的选择, 复杂度为o(n*3logn)。
def find(p, x):
l = 0; r = len(p)-1
while l<=r:
mid = (l+r)>>1
if x*p[mid]>p[-1]:
r = mid-1
else : l = mid+1
return x*p[l] def solve(n):
p=[1]; cnt = 0 # cnt
while cnt < n:
cnt += 1
a = find(p, 2)
b = find(p, 3)
c = find(p, 5)
p.append(min(a, b, c) )
print p[-1] if __name__ == '__main__':
n = input()
solve(n)
ural 1748 The Most Complex Number 和 丑数的更多相关文章
- URAL 1748. The Most Complex Number(反素数)
题目链接 题意 :给你一个n,让你找出小于等于n的数中因子个数最多的那个数,并且输出因子个数,如果有多个答案,输出数最小的那个 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. ( ...
- URAL 1748 The Most Complex Number
题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...
- LeetCode OJ:Ugly Number(丑数)
Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...
- 【easy】263. Ugly Number 判断丑数
class Solution { public: bool isUgly(int num) { ) return false; ) return true; && num % == ) ...
- 264 Ugly Number II 丑数 II
编写程序找第 n 个丑数.丑数就是只包含质因子 2, 3, 5 的正整数.例如, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 就是前10个丑数.注意:1. 1 一般也被当做丑数2. ...
- 313 Super Ugly Number 超级丑数
编写一段程序来寻找第 n 个超级丑数.超级丑数是指其所有质因数都在长度为k的质数列表primes中的正整数.例如,[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] ...
- Leetcode264. Ugly Number II丑数2
编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 ...
- [LeetCode]313. Super Ugly Number超级丑数,丑数系列看这一道就行了
丑数系列的题看这一道就可以了 /* 和ugly number2差不多,不过这次的质因子多了,所以用数组来表示质因子的target坐标 target坐标指的是这个质因子此次要乘的前任丑数是谁 */ pu ...
- LeetCode OJ 之 Ugly Number (丑数)
题目: Write a program to check whether a given number is an ugly number. Ugly numbers are positive num ...
随机推荐
- uCGUI窗口操作要点
uCGUI窗口操作要点 1. 创建一个窗口的时候,会给此窗口发送“创建(WM_CREATE)”消息,从而执行它的回调函数:如果创建窗口的标志带有“可视标志(WM_CF_SHOW)”,那么在后续执行GU ...
- StringBuffer与StringBuilder原理与区别
其实只要找下Google大神就有答案了:StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized ...
- Spring核心框架 - AOP之动态代理机制
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类. ...
- android:Faild to install,你的主机中的软件终止了一个连接错误解决
当在用真机调试android程序时出现Faild to install,你的主机中的软件终止了一个连接错误时可以这样解决: 在手机开启usb调试和安装未知来源软件的情况下: 1:先查进入任务管理器查看 ...
- 重启Finder
解决Finder卡死的问题! 方法一:在Dock 图标上操作 按住 Option 键并右键点按 Finder 图标,选择菜单中的“重新开启” 方法二:在终端里操作 打开终端(应用程序 – 实用工具), ...
- win10应用安装位置修改方法
win10应用安装位置怎么改?很多用户升级win10的系统之后,对于win10应用装置的位置如何修改一直不知道如何解决,今天,小编就跟大家一起来看看如何修改win10应用装置的位置. win10应用安 ...
- 简单的php表单
表单的三种传递机制: $_GET:不安全,传递的参数会显示在url中. $_POST:相对安全,隐形传递. $_REQUEST:宽松的,包含所有 GET.POST.COOKIE 和 FILE 的数据. ...
- A Neural Network in 11 lines of Python
A Neural Network in 11 lines of Python A bare bones neural network implementation to describe the in ...
- zoj 3765
一道区间更新.查询的题: 但是线段树不能做插入: 后来才知道用splay: splay用来做区间查询的话,先将l-1旋转到根节点,然后把r+1旋转到根节点的右节点: 这样的话,根节点的右节点的左子树就 ...
- Vector 的清空
前两天比赛有一道题,有用到了vector的清空,用的是swap,我一开始还不太清楚,所以去查了下资料,转载一篇关于vector的清空的. vector <int> vecInt; ; i& ...