bzoj 2721(线性筛)(约数个数)

传送门

题解:

设y=n!+t,化简后知x=(n!)^2/t+n!。

所以求(n!)^2的约数个数即可。

约数个数公式:

若x=(p1^k1)*(p2^k2)*...*(pm*km),则x的约数个数d(x)=(k1+1)*(k2+1)*...*(km+1)

所以后面枚举每个预先线性筛筛出的质数,计算它的k,由于是(n!)^2,所以每一个质数的贡献是ki*2+1,最后乘起来即可。

复杂度是个好问题,实测出来大概是3n?我觉得应该是1~n每个数分解质因数后的质因数指数之和?

#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int MAXN=1e6+4;
const ll MOD=1e9+7;
int n;
int prime[MAXN],cnt[MAXN],tot=0,ans=1;
bool vis[MAXN];
inline void linear_shaker() {
	for (register int i=2;i


你可能感兴趣的:(OI-数学)