考虑下面一个问题:

题面

题目描述

q次询问,每次将n质因数分解。

输入格式

第一行输入q,表示询问的次数。

第二至第q+1行,每行输入n,表示需要进行质因数分解的数。

输出格式

对于每次询问,将n分解质因数。

样例输入/输出

Input
3
12
2310
1000000007

Output
3=1×3
12=2^2×3
2310=2×3×5×7×11
1000000007=1000000007

数据范围

本题采用捆绑测试。
Subtask 1(10pts): 因数分解python 因数分解公式法_因数分解python
Subtask 2(20pts): 因数分解python 因数分解公式法_算法_02
Subtask 3(40pts): 因数分解python 因数分解公式法_分解质因数_03
Subtask 4(30pts): 因数分解python 因数分解公式法_质因数分解_04

思路

Subtask 1

对于每次询问,直接从1枚举到n;如果枚举到的那个数为质数,那么就看n是否能被它整除;如果可以就不停地将n除以它,直到不能除(即n无法被它整除)为止。

时间复杂度: O(因数分解python 因数分解公式法_因数分解python_05)。
如果您现在还在用这种方法判素数,那么您就是萌新。

Subtask 2

容易发现根本就不需要判素数。原因如下:

如果这个数i能否拆分为一些数的乘积,且i能被n整除;那么i的所有因数就一定能被n整除。而之前已经枚举过了n的真因数(一个数的真因数为它的所有因数除去1和它自己),所以如果i不是质数那么n就一定不能被i整除。

去掉判素数的步骤即可。

时间复杂度: O(因数分解python 因数分解公式法_算法_06)。
如果您现在还在用这种方法判素数,那么您就是普及组能力以下的选手。

Subtask 3

注意到,我们只需要把i从1枚举到n的平方根(sqrt(n))。经过这复杂度为O(sqrt(n))的枚举过后,n必定是一个质数或是1.

原因显然,自己举几个例子就明白了。

时间复杂度: O(因数分解python 因数分解公式法_质因数分解_07)。

如果您在用这种方法进行单个数的质因数分解,那么我就不能估计您的能力了;
如果您还在用这种方法进行多个数的质因数分解,那么您就是普及组选手 (话说我不是吗)

Subtask 4

这是质因数分解,所以我们只需要枚举质数能否被n整除。

那么,我们就可以提前用筛除sqrt(maxn)以内的质数,然后到时候只需要枚举这些质数能否被n整除就好啦。

当然,我们还要记住这句话 :我们只需要把i从枚举在n的平方根(sqrt(n))以内的质数。经过这复杂度远小于O(sqrt(n))的枚举过后,n必定是一个质数或是1。

注意到这一步是常数优化,但是往往这也是最重要的一步。

顺便提一句,这题中尽量要用欧拉筛,否则特别容易被卡常。