n!素因子分解2
2015-08-02 11:09
253 查看
有的时候我们需要对n!进行素因子分解,如果我们对1~n的每一个数都进行素因子分解然后再进行合并的话那么显然是很慢的因此我们需要重新来考虑这个问题。
我们对n!进行素因子分解:
n! = 1*2*3*4*…*n,因此它一定含有小于等于n 的所有素数我们要对这些素数分别进行处理求出含有多少项。
例如我们求n!含有多少个素因子p
设f
[p] 表示n!含有多少素因子p;
1*2*3*4*…n = p^(n/p)(1*2*,,,,*(n/p))
那么 f
[p] = n/p + f[n/p][p],就可以通过递归的方法求出了。
题目
我们对n!进行素因子分解:
n! = 1*2*3*4*…*n,因此它一定含有小于等于n 的所有素数我们要对这些素数分别进行处理求出含有多少项。
例如我们求n!含有多少个素因子p
设f
[p] 表示n!含有多少素因子p;
1*2*3*4*…n = p^(n/p)(1*2*,,,,*(n/p))
那么 f
[p] = n/p + f[n/p][p],就可以通过递归的方法求出了。
题目
#include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; const int mod = 1e9+7; const int maxn=1e6+5; bool prime[maxn]; int p[maxn/10]; int k; void isprime() { k=0; LL i,j; memset(prime, true, sizeof(prime)); for(i=2; i<maxn; i++) { if(prime[i]) { p[k++]=i; for(j=i*i; j<maxn; j+=i) prime[j]=false; } } } LL get(LL m, LL p) { if(m<p) return 0; return m/p+get(m/p,p); } LL quickmod(LL a, LL b) { LL ans = 1; while(b) { if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans ; } int main() { isprime(); int n; while(~scanf("%d",&n)) { LL ans=1; LL m = quickmod(2,(LL)mod-2); for(int i=0; i<k&&p[i]<=n; i++) { LL tmp = (get(n,p[i])*2+1)%mod; ans=ans*tmp%mod; } ans = ans*m%mod; ans = (ans+m%mod)%mod; printf("%lld\n",ans); } return 0; }
相关文章推荐
- #数据挖掘与数据化运营实战#2.3数据挖掘技术以及在数据化运营中的应用
- hihoCoder - 1152 - Lucky Substrings
- 机房收费之充值窗体
- iOS Quartz2D - 屏幕截图
- iOS Quartz2D - 给图片加水印
- 常用mac/unix/linux命令
- 重载 vs 重写
- php-面向对象(6)
- acm-UVA11935解题报告
- 学单片机预备知识、如何点亮一个发光管、流水灯程序
- MongoDB 在windows shell环境下的基本操作和命令的使用示例(三)
- 用Model-View-ViewModel构建iOS App
- 虚函数与虚继承
- 计数排序
- HDU 5336 XYZ and Drops(模拟十滴水游戏 BFS啊)
- iOS Quartz2D - 裁剪图片为带边框的圆形图片
- 早期(编译期)优化
- android 中 View的构造函数
- win7应用程序出现乱码 解决方法
- 图层损坏 E/ArcGIS﹕ The map or layer has been destroyed or recycled. 资源未释放