题解 | #质数因子#埃氏筛+最大质因子性质
质数因子
http://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607
从i = 2开始遍历的时候,使用如下两个方法对代码进行优化:
一个正整数的质因子,最多只有一个大于其平方根。
证明:假设有超过一个质因子大于其平方根,那么二者相乘一定大于该数。得证。
如果找到一个质因子,那么该质因子的2倍、3倍...都不是质因子。
#include <bits stdc++.h> using namespace std; //constexpr long long N = 1e10 + 10; //bool st[N]; unordered_map<long, bool> st; inline void solve(long &n) { for (long i = 2; i <= (long)sqrt(n); i++) { for (;!st[i] && n % i == 0;) { cout << i << ' '; n /= i; for (long j = i + i; j <= (long)sqrt(n); j += i) st[j] = true; } } if (n != 1) cout << n << ' ' << endl; } int main() { cin.tie(nullptr)->sync_with_stdio(false); long n; for (; cin >> n; st = {}) solve(n); return 0; }
注意
如果存在一个质因子比原 n
的开方大,那么最后一次执行 n /= i
后,i
超过 sqrt(n)
退出循环,此时的 n
一定是原 n
的约数,且如果他不是1的话,一定是个质数。</long,>