·方法一
·方法二
·時間測試
方法一:篩法
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; }
時間測試:
#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; }