因数(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
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int pr[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; 7 long long pw[15][64],C[64][64],ans; 8 long long inf; 9 long long min(long long a,long long b) 10 { 11 if (a<b) return a; 12 else return b; 13 } 14 void dfs(int t,long long now,long long pre,long long s,int down) 15 { 16 if (s>ans) return; 17 if (now==1) 18 { 19 ans=min(ans,s); 20 return; 21 } 22 if (t>14) return; 23 for (int i=pre+1;i<=min(pre+down,62);i++) 24 if (now%C[i][i-pre]==0&&pw[t][i-pre]&&s<=inf/pw[t][i-pre]) 25 dfs(t+1,now/C[i][i-pre],i,s*pw[t][i-pre],i-pre); 26 } 27 void ask_ans(long long k) 28 { 29 ans=inf; 30 dfs(0,k,0,1,62); 31 ans=max(ans,2); 32 } 33 int main() 34 {int i,j,k; 35 freopen("factor.in","r",stdin); 36 freopen("factor.out","w",stdout); 37 C[0][0]=1; 38 for (i=1;i<64;i++) 39 { 40 C[i][0]=C[i][i]=1; 41 for (j=1;j<i;j++) 42 C[i][j]=C[i-1][j-1]+C[i-1][j]; 43 } 44 for (i=0;i<=14;i++) 45 { 46 pw[i][0]=1; 47 for (j=1;j<=63;j++) 48 { 49 if (i&&pw[i][j-1]>inf/pr[i]) break; 50 pw[i][j]=pw[i][j-1]*pr[i]; 51 } 52 if (i==0) 53 inf=pw[0][63]-1; 54 } 55 while (cin>>k) 56 { 57 ask_ans(k); 58 cout<<k<<' '<<ans<<endl; 59 } 60 }
转载于:https://www.cnblogs.com/Y-E-T-I/p/7521413.html
因数(factor)相关推荐
- 1049. Counting Ones (30)
题目如下: The task is simple: given any positive integer N, you are supposed to count the total number o ...
- 《泛型编程与stl》
以下是STL六大组件(componments): adapters 配接器 用来修饰其他组件.包括iterator adapters.function adapters.container ada ...
- GMAT750分冲刺-Quantitative
这次Q49+V34,680,比上次轻松的多,果然读的懂才是真本事. 好好复习+鸡精调味,下次就实现了. 做不出来答案的时候,很可能是题目读错了. 总结考点的目的在于构建自己的知识体系,而刷题的作用让你 ...
- 英语单词 factor cull
factor 英[ˈfæktə®] 美[ˈfæktər] n. 因素; 要素; 因子; 因数; (增或减的) 数量,倍数; v. 把-因素包括进去; (数学) 分解-的因子,将-分解成因子; 以代理商 ...
- python中factor函数_Python入门-函数
函数 在维基百科上函数式这样描述的: 函数在数学中为两集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素. 此处的函数区别于我们数学上的函数,在编程世界中,函数(Funct ...
- POJ 3471 Integral Roots(素数、因数)
题目链接:http://poj.org/problem?id=3471 题意:给出一个多项式f(x),求f(x)=0所有的整数根. 思路:由于求的是f(x)的整数根,设它的整数根分别为x1,x2--, ...
- 系数( coefficients)、因数或因子( factors)
物理量名称中所用术语的规则 系数( coefficients) ,因数或因子( factors) 的用法 在一定条件下,如果量 A 正比于量 B,则可以用乘积关系式 A =kB 表示,式中作 为乘数出 ...
- min_25 JZOJ5594 最大真因数
Time Limits: 2000 ms Memory Limits: 524288 KB Detailed Limits Downloads Description 一个合数的真因数是指这个数不包括 ...
- [JZOJ5594][min25筛]最大真因数
题目描述 一个合数的真因数是指这个数不包括其本身的所有因数,例如6 的正因数有 1; 2; 3; 6,其中真因数有1; 2; 3.一个合数的最大真因数则是这个数的所有真因数中最大 的一个,例如6 的最 ...
最新文章
- PHP 字符串与数组间的相互转化
- jQuery的each()方法
- select选择框必输校验_轮子这么多,我们为什么选择自研NewSQL
- 双目立体放大!谷歌刚刚开源的这篇论文可能会成为手机双摄的新玩法
- centos修改系统可用内存_Centos7 因内存 可用大小不足,被killed的解决办法
- ios沙箱模式开启_【iOS】苹果IAP(内购)中沙盒账号使用注意事项
- 域名平台SSL证书及Nginx 配置SSL证书简易教程
- PTA--Reversing Linked List
- Security+ 学习笔记5 常见的网络攻击
- 2008年最新CCNA第二学期第十单元题目(2008-12-14 14:34:59)
- yolov5s 目标检测模型实战——火点烟雾检测实战
- MySQL 游标的详解
- yolov3与yolov4效果对比_知识精讲 | Yolov3和Yolov4核心内容、代码梳理_创事记(5)
- excel高级筛选怎么用_如何用excel在筛选状态下怎么复制粘贴?
- CCF考试——201412-4最优灌溉
- 【软考中级】多媒体应用设计师复习笔记第二章
- 一招解决苹果签名包掉包问题,一年只需签一次
- MySQL InnoDB 存储引擎原理浅析
- java jama matrix转数组_Java Jama矩阵问题
- 目标追踪与定位实战笔记2-一生之敌:Cuda out of memory!
热门文章
- C++控制不同进制输出(二进制,八进制,十进制,十六进制)各种进制之间的转换
- 谷歌404页面html,简洁404页面HTML好看的404错误页源码
- C语言中##和#的作用
- 一篇文章让你了解大数据采集技术
- 【编译和解释】【源代码和目标代码】【静态语言和脚本语言】
- 【youcans 的 OpenCV 学习课】7. 空间域图像滤波
- 大麦网启动“麦香计划”,将投3亿元布局戏剧内容领域
- 程序员代码下的许豪杰
- while、do...while、for循环的使用
- bazel切换版本笔记