N!分解素因子及若干问题【转载】
这里写的非常好http://www.cnblogs.com/openorz/archive/2011/11/14/2248992.html,感谢博主,我这里就直接用了。
将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的个数。
于是有代码
int f(int n,int p)
{
if(n==) return ;
return f(n/p) + n/p;
}
将问题推广一下:
问题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的形式,只要拿分子素因子的幂减去分母对应的素因子的幂即可。好了,后面就简单了,二分快速幂取模......
N!分解素因子及若干问题【转载】的更多相关文章
- FZU OJ 1075 :分解素因子
Problem 1075 分解素因子 Accept: 2161 Submit: 4126Time Limit: 1000 mSec Memory Limit : 32768 KB Pro ...
- fuzhou 1075 分解素因子
Problem 1075 分解素因子 Accept: 1331 Submit: 2523Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】
[唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...
- 给定n,求1/x + 1/y = 1/n (x<=y)的解数~hdu-1299~(分解素因子详解)
链接:https://www.nowcoder.com/acm/contest/90/F来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整 ...
- LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子
http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分 ...
- LightOj 1236 - Pairs Forming LCM (分解素因子,LCM )
题目链接:http://lightoj.com/volume_showproblem.php?problem=1236 题意:给你一个数n,求有多少对(i, j)满足 LCM(i, j) = n, ...
- POJ 1811 Prime Test 素性测试 分解素因子
题意: 给你一个数n(n <= 2^54),判断n是不是素数,如果是输出Prime,否则输出n最小的素因子 解题思路: 自然数素性测试可以看看Matrix67的 素数与素性测试 素因子分解利用 ...
- hdu-1299 Diophantus of Alexandria(分解素因子)
思路: 因为x,y必须要大与n,那么将y设为(n+k);那么根据等式可求的x=(n2)/k+n;因为y为整数所以k要整除n*n; 那么符合上面等式的x,y的个数就变为求能被n*n整除的数k的个数,且k ...
- Java hashCode() 和 equals()的若干问题解答<转载自skywang12345>
第1部分 equals() 的作用equals()的作用是用来判断两个对象是否相等.equals()定义在JDK的Object类中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否 ...
随机推荐
- webServices学习四(---WebService监听工具)
之前我们使用过HttpWatch获取的HTTP的调用过程,并获得了HTTP的请求头及其他请求的详细信息. 既然WebServie也是通过HTTP进行通信的,能不使用HTTPWatch来获取它的请求过程 ...
- Redis学习03——存储字符串(String)
--------------------- 作者:愤怒的小明 来源:CSDN 原文:https://blog.csdn.net/qiwenmingshiwo/article/details/78118 ...
- Vuejs实战项目三:退出系统功能实现
1.创建Mockjs接口 method:post url:/user/logout 描述:退出系统 response: { "code": 2000, //状态码 "fl ...
- linux sed命令使用疑惑总结
s 替换命令 [zhuhc@test111 ~]$ sed 's/ma/mass' test.txt , : unterminated `s' command 原因:替换命令s末尾的斜杠丢失了.正确命 ...
- Django项目:CRM(客户关系管理系统)--30--22PerfectCRM实现King_admin数据添加
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html # king_urls.py # ————————02PerfectCRM创建ADMIN页面—— ...
- loading遮罩
.loading{ position: relative; cursor: default; point-events: none; text-shadow: none!important; colo ...
- java如何使用 tesseract 4.0.0-1.4.4
提示: 建议直接使用tess4j,tess4j是对tesseract的封装,使用更简单 首先引入依赖 <!-- https://mvnrepository.com/artifact/org.by ...
- VC开发多语言界面 多种方法(非常easy) 有源代码
源代码地址(专业定制程序:MCU,Windows,Android .VC串口,Android蓝牙等不限.) (需源代码先留邮箱)先上图 1.通过遍历 得到全部控件ID号与TEXT,得到一个中文语言配置 ...
- 基于Kebernetes 构建.NET Core技术中台
原文:基于Kebernetes 构建.NET Core技术中台 我们为什么需要中台 我们现在处于企业信息化的新时代.为什么这样说呢? 过去企业信息化的主流重心是企业内部信息化.但现在以及未来的企业信息 ...
- Docker搭建ELK的javaweb应用日志收集存储分析系统
1.启动elasticsearch docker run -d --name myes -p 9200:9200 elasticsearch:2.3 2.启动kibana docker run --n ...