题面:阶层分解
思路
该题很容易就想到要把[1, N]中每个数包含的质因子p的个数算出来。
但是如果每个数都分解过去再合并,时间复杂度为O(N*sqrt(N)),题目N最大为1e6,必然超时。
在1~N中,至少包含1个质因子p的个数有 ⌊N / p⌋ (向下取整)个,而至少包含2个质因子p的个数有 ⌊N / p ^ 2⌋ 个,依次类推,直到 1 ~ N 中取不到是p的倍数的数。
所以,N!中质因子p的总个数为:
这样,对于N中每一个质因子p,计算上式,时间复杂度为O(log N),而对于N!分解质因子的时间复杂度就是 O(N * log N)。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N <