首先,我们要先知道一个定理,任意一个自然数都可以分解为素数之积(素数不再分解)
当我们对这条式子扩展到二维的时候:
当我们对这条式子扩展到n维的时候:
那么其对应的自然N的n次方的约数个数为:
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
/*素数表*/
vector<int> ps;
bool is[40010];
void init() {
fill(is, is + 40010, 1);
ps.clear();
is[0] = is[1] = false;
for(int i = 2; i < 40010; ++i) {
if(is[i]) {
for(int j = i + i; j < 40010; j += i)is[j] = false;
}
}
for(int i = 2; i < 40010; ++i) {
if(is[i])ps.push_back(i);
}
}
/* n的P次方的因数的个数 */
ll CC(ll n, ll p=1) {
ll res = 1;
/*ps[idx]*ps[idx]<=n 的设置原理 : 任何一个合数都可以分解为比这个合数小的素数之积*/
/* 当ps大于分界线时 n/ps整除的结果 可能有两种情况:
一种是素数(那么它必定小于分界线,所以在之前就被计算过了)
另一种是合数(也小于分界线), 又合数可以分解为比它本身小的素数积,那么他也一定被计算过了*/
for(int idx = 0; ps[idx]*ps[idx] <= n && idx < ps.size(); ++idx) {
if(n % ps[idx] == 0) {