一个最基本的算数法则就是大于1的整数都能用1个或多个素数相乘的形式表示出来。当然,有多种质因子排列方案

如:

10=2×5=5×2    20=5×2×2=2×5×2=2×2×5

用f(k)表示k的质因数排列数,f(10)=2,f(20)=3

给一个n,至少有一个k满足f(k)=n的最小k

输出格式:n和k

输入:

1

2

3

105

输出:

1 2

2 6

3 12

105 720

数据范围

n,k<2^63

我们令k=∏piei

  S=∑ei

f(k)=S!/(∏ei!)

解释一下:S是所有因数的个数,ei是每一种因数的个数

显然不考虑重复的情况时方案为S!

那么算上重复的会怎样?

1112是已定的

如果是算总方案显然4!,那么111会导致的重复方案是3!2导致的重复方案为1!

所以有了以上结论

那么我们有了一种方法:枚举k得到n

显然不行

那么是否可以试一下已知n,得到k?

已知对于一个指数e,如果在可行条件下,那么它显然优先给最小的质因数,这能导致k最小

搜索+剪枝实现

剪枝1:上面说的优先给小的素数,就是说ei要单调递增,因为如果ei>ej,i>j,那么显然把ei与ej

交换才能最优

剪枝2:假设你每举了t素数的指数e

就要把n除以 ((S-e+1)*...*S) /e!

如何高效算出?

原式=>S!/(e!*(S-e)!)

这不就是C(S,S-e)吗?

预处理出C,然后每一层枚举一个素数的指数,然后向下

剪枝3:最优性剪枝,当前k>ans 则退出

预处理幂不说了

但记住无论是幂,还是k,都不能超过(1<<63)-1

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int pr[]={,,,,,,,,,,,,,,};
long long pw[][],C[][],ans;
long long inf;
long long min(long long a,long long b)
{
if (a<b) return a;
else return b;
}
void dfs(int t,long long now,long long pre,long long s,int down)
{
if (s>ans) return;
if (now==)
{
ans=min(ans,s);
return;
}
if (t>) return;
for (int i=pre+;i<=min(pre+down,);i++)
if (now%C[i][i-pre]==&&pw[t][i-pre]&&s<=inf/pw[t][i-pre])
dfs(t+,now/C[i][i-pre],i,s*pw[t][i-pre],i-pre);
}
void ask_ans(long long k)
{
ans=inf;
dfs(,k,,,);
ans=max(ans,);
}
int main()
{int i,j,k;
freopen("factor.in","r",stdin);
freopen("factor.out","w",stdout);
C[][]=;
for (i=;i<;i++)
{
C[i][]=C[i][i]=;
for (j=;j<i;j++)
C[i][j]=C[i-][j-]+C[i-][j];
}
for (i=;i<=;i++)
{
pw[i][]=;
for (j=;j<=;j++)
{
if (i&&pw[i][j-]>inf/pr[i]) break;
pw[i][j]=pw[i][j-]*pr[i];
}
if (i==)
inf=pw[][]-;
}
while (cin>>k)
{
ask_ans(k);
cout<<k<<' '<<ans<<endl;
}
}

因数(factor)的更多相关文章

  1. [linux]收集一些好玩的命令

    1.rev命令 反转输出,输入的字符串. 在终端中输入:rev 输入需要字符串(支持中文) 2.asciiview命令 安装aview:apt-get install aview 再安装imagema ...

  2. 1049. Counting Ones (30)

    题目如下: The task is simple: given any positive integer N, you are supposed to count the total number o ...

  3. python常用标准库(math数学模块和random随机模块)

    常用的标准库 数学模块 import math ceil -- 上取整 对一个数向上取整(进一法),取相邻最近的两个整数的最大值. import math res = math.ceil(4.1) p ...

  4. 254. Factor Combinations 返回所有因数组合

    [抄题]: Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write ...

  5. The largest prime factor(最大质因数)

    1. 问题: The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number ...

  6. R语言学习——欧拉计划(3)Largest prime factor 求最大质因数

    The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60085 ...

  7. 抓其根本(一)(hdu2710 Max Factor 素数 最大公约数 最小公倍数.....)

    素数判断: 一.根据素数定义,该数除了1和它本身以外不再有其他的因数. 详见代码. int prime() { ; i*i<=n; i++) { ) //不是素数 ; //返回1 } ; //是 ...

  8. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  9. [LeetCode] Factor Combinations 因子组合

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

随机推荐

  1. C语言总结报告

    1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 当初报考计算机专业,是看到计算机专业在当今社会有良 ...

  2. 敏捷冲刺每日报告一(Java-Team)

    第一天报告(10.25  周三) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  3. 点击tableViewCell,调用打电话的功能

    对于点击tableViewCell,调用打电话的功能,按照一般的方法,使用Appdelegate的OpenUrl的方法,使用前先使用UIAlertView展示,让用户选择是否拨打,但是发现了个简单的方 ...

  4. cord-in-a-box 2.0 安装指南

    [TOC] 这篇文章简要介绍了 Ciab2.0 的安装. 包括硬件, 软件环境的选择, Ciab2.0的实际部署架构, 安装过程等. 下面就先对 Ciab2.0 部署环境做简要介绍. 1. 概述 这一 ...

  5. Xamarin控件使用之ListView

    listview单列多行的显示,以后再加多列多行的实例. [Activity(Label = "GraphicAll", LaunchMode = LaunchMode.Singl ...

  6. 爬虫小探-Python3 urllib.request获取页面数据

    使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...

  7. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  8. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...

  9. 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTtful API

    上一篇写的是使用静态基类方法的实现步骤:  http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...

  10. 使用Spring Initializr创建项目

    Spring initializr 是Spring 官方提供的一个很好的工具,可以用来用来创建一个Spring boot 的项目.可以选择使用Maven管理或者使用Gradle管理,还可以选择使用的编 ...