博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
N!分解素因子及若干问题【转载】
阅读量:5742 次
发布时间:2019-06-18

本文共 954 字,大约阅读时间需要 3 分钟。

这里写的非常好,感谢博主,我这里就直接用了。

将N!表示成

N! = p1^t1*p2^t2*…pi^ti…*pk^tk(其中p1,p2……pk是素数,1<N<= 10^6)

显然很容易通过素数筛选求出pi,因为1<pi<=N,关键是如何快速地求出ti。

我们先来看一下对于2这个素因子,把N!分成两部分,即奇偶两部分

 

假设N是偶数

N!

=1*2*3*4*5……N

=(2*4*6……) * (1*3*5……)

因为有N/2个偶数,所以偶数部分可以提出N/2个2,

=2^(N/2) * (1*2*3*……N/2) * (1*3*5*……)

=2^(N/2) * (N/2)! * (1*3*5*……)

 

看到了吗!神奇的事情发生了,N规模的问题转化成了N/2的问题了。上面假设了N是偶数,当然N是奇数时也是一样的,只要规定这里的除法是取整就可以了

 

于是有递推公式 f(n,2) = f(n/2,2) + n/2,表示n!中2的个数。

用同样的方法可以推出 f(n,p) = f(n/p) + n/p,表示n!中素数p的个数。 

于是有代码

 

1 int f(int n,int p)2 {3     if(n==0) return 0;4     return f(n/p) + n/p;5 }

 

 

将问题推广一下:

 

问题1:N!的末尾有几个0?

因为 10 = 2*5,所以只要知道N!有多少个2和多少个5,问题就解决了。Min(f(n,2),f(n,5)) 显然f(n,2)>f(n,5),所以问题就转化成了求f(n,5)。

 

问题2:N!的转化成12进制之后,末尾有几个0?

和问题一样,12=2*2*3,所以只要求Min(f(n,2)/2,f(n,3)),就可以了。

 

问题3: 求组合数C(n,m)(mod p)

C(n,m)=n!/(m!*(n-m)!) ,只要对分子和分母分别分解素因子,然后因为C(n,m)肯定是整数,所以C(n,m)肯定可以表示成p1^t1*p2^t2*......pi^ti的形式,只要拿分子素因子的幂减去分母对应的素因子的幂即可。好了,后面就简单了,二分快速幂取模......

转载于:https://www.cnblogs.com/zxhyxiao/p/8029063.html

你可能感兴趣的文章
关于批处理-1
查看>>
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
机器学习开源项目精选TOP30
查看>>
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>