mooyyu

M4 - 分解质因数

c++11 math map

template< class type >
inline int lowbit(const type x) { return -x & x; }

template< class type >
map< int, int >& pfactor(type x) {
	static int k;
	static type cur;
	static map< int, int > pfs;
	pfs.clear();
	k = lowbit(x), cur = x / k;
	while (k >>= 1u) ++pfs[2];
	for (int i = 3; i <= cur / i; i += 2)
		while (cur % i == 0) ++pfs[i], cur /= i;
	if (cur > 1) ++pfs[cur];
	return pfs;
}

Notes

  • n的所有质因子中至多只有一个大于sqrt(n)
  • 使用lowbit特判2
  • 枚举3~sqrt(n)范围的质因子
    1. 从小到大枚举,所以无需质数判定
    2. 当枚举出当前最小质因子xk个,继续嵌套枚举(x+1)~sqrt(n/(x^k))范围的质因子
  • 特判是否存在一个大于sqrt(n)的质因子