【Contest Hunter 3101】阶乘分解【数论,数学】
题目大意:
题目链接:http://contest-hunter.org:83/contest/0x30「数学知识」例题/3101 阶乘分解
将分解质因数。
思路:
,肯定是不能直接乘出来再分解的。
那么可以将1到的每个数分解质因数再合起来吗?时间复杂度,依旧不现实。
考虑每一个质数,在1到中,很明显是有(表示向下取整)个数字含有质因数,有个数有质因数有个数含有质因数。
所以,中就有个。
时间复杂度
代码:
#include <cstdio>
#define N 2000010
using namespace std;
int p[N],c[N],v[N],n,m;
long long k;
void prime() //线性筛质数
{
for (int i=2;i<=n;i++)
{
if (!v[i])
{
p[++m]=i;
v[i]=i;
}
for (int j=1;j<=m;j++)
{
if (p[j]>v[i]||i*p[j]>n) break;
v[i*p[j]]=p[j];
}
}
}
int main()
{
scanf("%d",&n);
prime();
for (int i=1;i<=m;i++)
{
k=1;
while (k*p[i]<=n)
{
k*=p[i];
c[i]+=n/k; //记录个数
}
}
for (int i=1;i<=m;i++)
printf("%d %d\n",p[i],c[i]);
return 0;
}