因数最多的数

样例输入

3
10
100
1000

样例输出

6
60
840

题解:

比如24= 23x 3,它的因数个数有(3 + 1)*(1 +1)=8个。

本题我们只要枚举每个质数的次数即可,用DFS来寻找答案。前15个质数之积已经大于1016,所以我们枚举这15个质数就足够了。

注意第i个质数的次数一定大于第i + 1个质数的次数。因为我们是求最小的那个因数最多的数,如果大质数的次数大于小质数的次数,那交换双方次数,因数个数不会变,但是数会减小。

利用这一点,可以把每次枚举的范围缩小。还有一些剪枝, 比如当前数大于n,就不用往后考虑了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 const double PI = acos(-1);
17 const double eps =1e-8;
18 #define Bug cout<<"---------------------"<<endl
19 const int maxn=1e5+10;
20 using namespace std;
21 const int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
22
23 LL n;
24 int ans_t;//答案的因子个数
25 LL ans;//答案
26
27 void DFS(int step,int lim,int num,LL sum)//step表示第几个质数,lim表示该质数最高次幂,num表示因子个数,sum表示总和
28 {
29     if(num>ans_t)//找因子个数最大的答案
30     {
31         ans_t=num;
32         ans=sum;
33     }
34     else if(ans_t==num&&sum<ans)//找数字最小的答案
35         ans=sum;
36     if(step>=15) return;//递归出口
37     for(int i=0;i<=lim;i++)
38     {
39         if(i!=0) sum*=prime[step];
40         if(sum>n) break;
41         DFS(step+1,i,num*(i+1),sum);
42     }
43 }
44
45 int main()
46 {
47     #ifdef DEBUG
48     freopen("sample.txt","r",stdin);
49     #endif
50     ios_base::sync_with_stdio(false);
51     cin.tie(NULL);
52
53     int T;
54     scanf("%d",&T);
55     while(T--)
56     {
57         scanf("%lld",&n);
58         ans_t=0;
59         DFS(0,60,1,1);
60         printf("%lld\n",ans);
61     }
62
63     return 0;
64 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12178095.html

时间: 2024-08-30 09:50:03

因数最多的数的相关文章

数组中出现最多的数,以及接口 Map.Entry&lt;K,V&gt;

1 package test.tools; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 public class TestArr { 9 10 public static void MaxCount(int[] arr) { 11 Map<Integer, Integer> map = new Ha

出现次数最多的数-CCF模拟

问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小的一个. 样例输入 6 10 1 10 20 30 20 样例输出 10 #include <iostream>

寻找数组中重复次数最多的数

#include<iostream> #include<map> using namespace std; int helper(const int a[],const int n) { map<int,int> m; for(int i = 0;i<n;i++) m[a[i]]++; map<int,int>::iterator comp = m.begin(); for( map<int,int>::iterator it = comp

CCF 201312-1 出现次数最多的数 (水题)

问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小的一个. 样例输入 6 10 1 10 20 30 20 样例输出 10 析:可以先排序,再挨着算,更新.也可以

待字闺中之最多连续数的子集

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 给一个整数数组a[]. 找到当中包括最多连续数的子集,比方给:15, 7, 12, 6, 14, 13, 9, 11,则返回: 5:[11, 12, 13, 14, 15] . 分析:最简单的方法是sort然后scan一遍,可是要 o(nlgn) , 有什么 O(n) 的方法吗?网上有人用map或set来做.但map或set的复杂度还是O(nlgn).并查集能够做到O(n),此题用并查集比較简单. 下面參考h

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

出现次数最多的数

http://blog.csdn.net/pipisorry/article/details/39434403 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, -, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小

CCF 出现次数最多的数 201312-1

出现次数最多的数 问题描述 试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多

【CCF】出现次数最多的数

问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, -, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小的一个. 样例输入 6 10 1 10 20 30 20 样例输出 10 代码如下: #include <ios