·方法一
·方法二
·时间测试
方法一:筛法
for(int i = 1; i <= n; ++i)
for(int j = 1; i * j <= n; ++j)
d[i * j]++;
方法二:质因数分解
若A|B 则
a1<=b1,a2<=b2···an<=bn (a,b分别指正数A,B的质因数)
则A可取 (0~a1)*(0~a2)*···*(0~an)
即 (a1+1)*(a2+1)*···*(an+1)
#include <cstdio>
#include <cstring>
#define N 100001
int n,p;
bool mark[N];
int prime[N];
void get_prime(){
for(int i = 2; i <= N;++i){
if(!mark[i]) prime[++p] = i;
for(int j = 1; j <= p; ++j){
if(i * prime[j] > N) break;
mark[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
}
int get(int n1){
int w1[N];
memset(w1, 0, sizeof(w1));
for(int i = 1; prime[i] <= n1; ++i){
while(n1 % prime[i] == 0){
w1[i]++;
n1 = n1 / prime[i];
}
}
int ans = 1;
for(int i = 1; i <= p; ++i) ans = ans * (w1[i] + 1);
return ans;
}
int main(){
get_prime();
printf("%d", get(36));
//for(int i = 1; i <= p; ++i) printf("%d ", prime[i]);
return 0;
}
时间测试:
![](https://img2018.cnblogs.com/blog/1689319/201905/1689319-20190519215058018-76202003.png)
#include <bits/stdc++.h>
using namespace std;
const int N = 100001;
int n,p;
int prime[N],mark[N],d[N];
void od(){
for(int i = 1; i <= n; ++i){
for(int j = 1; i * j <= n; ++j){
d[i * j]++;
}
}
/*for(int i = 1; i <= n; ++i){
for(int j = 1; i * j <= n; ++j){
d[i * j].push_back(i);//约数
}
}
for(int i = 1; i <= n; ++i){
for(int j = 1; i * j <= n; ++j){
d[i * j] += i; //约数和
}
}
for(int i = 1; i <= n; ++i){
for(int j = 2; i * j <= n; ++j){
d[i * j] += i; //约数和(不包自身)
}
}*/
}
void get_prime(){
for(int i = 2; i <= n; ++i){
if(!mark[i]) prime[++p] = i;
for(int j = 1; j <= p; ++j){
if(i * prime[j] > n) break;
mark[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
int od1(){
int w1[N];
int pp = 0, n1 = n;
for(int i = 1; i <= p && prime[i] <= n1; ++i){
if(n1 % prime[i] == 0) w1[++pp] = 0;
while(n1 % prime[i] == 0){
n1 /= prime[i];
w1[pp]++;
}
}
int ans = 1;
for(int i = 1; i <= pp; ++i) ans *= w1[i] + 1;
return ans;
}
int main(){
clock_t start, end;
n = 99999;
cout << "n = " << n << endl;
start = clock();
od();
end = clock();
cout << "筛法时间:" << (double)(end - start) / CLOCKS_PER_SEC << "秒" << endl;
cout << "d(n) = " << d[n] << endl;
start = clock();
get_prime();
int ans = od1();
end = clock();
cout << "质因数分解时间:" << (double)(end - start) / CLOCKS_PER_SEC << "秒" << endl;
cout << "d(n) = " << ans << endl;
return 0;
}