一个最基本的算数法则就是大于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)相关推荐

  1. 1049. Counting Ones (30)

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

  2. 《泛型编程与stl》

    以下是STL六大组件(componments): adapters  配接器 用来修饰其他组件.包括iterator adapters.function  adapters.container ada ...

  3. GMAT750分冲刺-Quantitative

    这次Q49+V34,680,比上次轻松的多,果然读的懂才是真本事. 好好复习+鸡精调味,下次就实现了. 做不出来答案的时候,很可能是题目读错了. 总结考点的目的在于构建自己的知识体系,而刷题的作用让你 ...

  4. 英语单词 factor cull

    factor 英[ˈfæktə®] 美[ˈfæktər] n. 因素; 要素; 因子; 因数; (增或减的) 数量,倍数; v. 把-因素包括进去; (数学) 分解-的因子,将-分解成因子; 以代理商 ...

  5. python中factor函数_Python入门-函数

    函数 在维基百科上函数式这样描述的: 函数在数学中为两集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素. 此处的函数区别于我们数学上的函数,在编程世界中,函数(Funct ...

  6. POJ 3471 Integral Roots(素数、因数)

    题目链接:http://poj.org/problem?id=3471 题意:给出一个多项式f(x),求f(x)=0所有的整数根. 思路:由于求的是f(x)的整数根,设它的整数根分别为x1,x2--, ...

  7. 系数( coefficients)、因数或因子( factors)

    物理量名称中所用术语的规则 系数( coefficients) ,因数或因子( factors) 的用法 在一定条件下,如果量 A 正比于量 B,则可以用乘积关系式 A =kB 表示,式中作 为乘数出 ...

  8. min_25 JZOJ5594 最大真因数

    Time Limits: 2000 ms Memory Limits: 524288 KB Detailed Limits Downloads Description 一个合数的真因数是指这个数不包括 ...

  9. [JZOJ5594][min25筛]最大真因数

    题目描述 一个合数的真因数是指这个数不包括其本身的所有因数,例如6 的正因数有 1; 2; 3; 6,其中真因数有1; 2; 3.一个合数的最大真因数则是这个数的所有真因数中最大 的一个,例如6 的最 ...

最新文章

  1. PHP 字符串与数组间的相互转化
  2. jQuery的each()方法
  3. select选择框必输校验_轮子这么多,我们为什么选择自研NewSQL
  4. 双目立体放大!谷歌刚刚开源的这篇论文可能会成为手机双摄的新玩法
  5. centos修改系统可用内存_Centos7 因内存 可用大小不足,被killed的解决办法
  6. ios沙箱模式开启_【iOS】苹果IAP(内购)中沙盒账号使用注意事项
  7. 域名平台SSL证书及Nginx 配置SSL证书简易教程
  8. PTA--Reversing Linked List
  9. Security+ 学习笔记5 常见的网络攻击
  10. 2008年最新CCNA第二学期第十单元题目(2008-12-14 14:34:59)
  11. yolov5s 目标检测模型实战——火点烟雾检测实战
  12. MySQL 游标的详解
  13. yolov3与yolov4效果对比_知识精讲 | Yolov3和Yolov4核心内容、代码梳理_创事记(5)
  14. excel高级筛选怎么用_如何用excel在筛选状态下怎么复制粘贴?
  15. CCF考试——201412-4最优灌溉
  16. 【软考中级】多媒体应用设计师复习笔记第二章
  17. 一招解决苹果签名包掉包问题,一年只需签一次
  18. MySQL InnoDB 存储引擎原理浅析
  19. java jama matrix转数组_Java Jama矩阵问题
  20. 目标追踪与定位实战笔记2-一生之敌:Cuda out of memory!

热门文章

  1. C++控制不同进制输出(二进制,八进制,十进制,十六进制)各种进制之间的转换
  2. 谷歌404页面html,简洁404页面HTML好看的404错误页源码
  3. C语言中##和#的作用
  4. 一篇文章让你了解大数据采集技术
  5. 【编译和解释】【源代码和目标代码】【静态语言和脚本语言】
  6. 【youcans 的 OpenCV 学习课】7. 空间域图像滤波
  7. 大麦网启动“麦香计划”,将投3亿元布局戏剧内容领域
  8. 程序员代码下的许豪杰
  9. while、do...while、for循环的使用
  10. bazel切换版本笔记