您的位置:首页 > 其它

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],就可以通过递归的方法求出了。

题目

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: