阶乘分解。。
每个数分解质因数 再合并 复杂度N根号N。
会T。
我第一开始做法是:求出所有1-n所有质数。
遍历1-n,一个一个分解。。。。
复杂度n^2....
其实我们求出1-n中所有质数后。
对每个质数算出它的ci即可。
怎么算?
对于一个质数p,求它分解后的的次幂
p,p*2,p*3,……p*b //p*b<=n.这么些个数都会有p这个因子。总共下取整:n/p个
但是有些p^2的倍数我们算不到,所以再考虑p^2
p^2,2*p^2,3*p^2……b*p^2// b*p^2<=n..这么些个数都会有p^2这个因子。总共下取整:n/p^2个
同理 有些p^3的倍数算不到,以此类推。
知道p^x>n的时候停止。
很明显 x =0(logp(n)).
算一个质数的复杂度是这个,算n个质数的复杂度为 n*logp(n)
//KX
//#include <bits/stdc++.h>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
const int M = 1e6+7;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
int v[M],prime[M];
int pm;
void primes(int n)
{
for(int i=1;i<=n;i++)v[i]=0;
// memset(v,0,sizeof(v));//最小质因子
pm=0;//质数数量
for(int i=2;i<=n;i++)
{
if(v[i]==0)
{
v[i]=i;
prime[++pm]=i;
}
for(int j=1;j<=pm;j++)
{
//i有比prime[j]更小的质因子,或者超出n的范围,停止循环
if(prime[j]>v[i]||prime[j]>n/i)break;
//prime[j]是合数i*prime[j]的最小质因子
v[i*prime[j]]=prime[j];
}
}
//for(int i=1;i<=pm;i++)printf("%d\n",prime[i]);
}
int kx[M];
int main()
{
int n;
cin>>n;
primes(n);
for(int i=1;i<=pm;i++)
{
int tp=prime[i];
ll now=tp;
while(now<=n)
{
kx[i]+=n/now;
now*=tp;
}
}
for(int i=1;i<=pm;i++)
if(kx[i])printf("%d %d\n",prime[i],kx[i]);
return 0;
}