因数(factor)
一个最基本的算数法则就是大于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)的更多相关文章
- [linux]收集一些好玩的命令
1.rev命令 反转输出,输入的字符串. 在终端中输入:rev 输入需要字符串(支持中文) 2.asciiview命令 安装aview:apt-get install aview 再安装imagema ...
- 1049. Counting Ones (30)
题目如下: The task is simple: given any positive integer N, you are supposed to count the total number o ...
- python常用标准库(math数学模块和random随机模块)
常用的标准库 数学模块 import math ceil -- 上取整 对一个数向上取整(进一法),取相邻最近的两个整数的最大值. import math res = math.ceil(4.1) p ...
- 254. Factor Combinations 返回所有因数组合
[抄题]: Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write ...
- 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 ...
- 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 ...
- 抓其根本(一)(hdu2710 Max Factor 素数 最大公约数 最小公倍数.....)
素数判断: 一.根据素数定义,该数除了1和它本身以外不再有其他的因数. 详见代码. int prime() { ; i*i<=n; i++) { ) //不是素数 ; //返回1 } ; //是 ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- [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 ...
随机推荐
- 福州大学W班-助教总结
开学初对自己的期望 在即将到来的学期前,我希望我可以做到以下几点: 1.多参与同学的课程设计,并提出自己的见解 2.不断提高个人的专业技能,活到老学到老 3.能够及时对同学的博客进行评论,并给出有用的 ...
- C语言博客作业——函数
一.PTA实验作业 题目1:6-6 使用函数输出水仙花数 1.本题PTA提交列表 2. 设计思路 int narcissistic( int number ) //函数定义 1.定义整数型变量a.i分 ...
- router问题
var http = require("http"); var router = require("./router.js"); //创建服务器 var ser ...
- 使用SecureCRTP 连接生产环境的web服务器和数据库服务器
一.使用SecureCRTP 连接生产环境的web服务器 首先,需要知道以下参数信息: 1.web服务器的ip地址 2.服务器的端口号 3.会话连接的用户名和密码 4.服务器的用户名 ...
- centos 开放端口
1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
- 在网络编程中的io流小问题
在客户端和服务端调用io流进行传输数据的过程中,当将数据write到outputstream中,需要及时刷新,否则会发生io阻塞. 在输入数据的时候,最好选用BufferedReader,因为read ...
- ajax和jquery使用技巧
1.使用ajax的方法的时候可以使用u方法来获取连接,这样更加安全:alert弹窗的时候需要单引号双引号火狐浏览器会报错!
- jq 滚轮监听事件
windowAddMouseWheel(); function windowAddMouseWheel() { var i = 0; var scrollFunc = function (e) { e ...
- 阿里云API网关(6)用户指南(开放 API )
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...