1.求 1- n每个数的约数个数
//包括这个数本身
for( int i = 1; i <= n; ++i )// i是约数
for( int j = i ; j <= n; j += i)// i的倍数就是原数
++f[j];
//不包括这个数本身
for( int i = 1; i <= n; ++i )
for( int j = i + i ; j <= n; j += i)
++f[j];
时间复杂度
∫ 1 n n x d x = n ln n \int_{1}^{n} \frac{n}{x} dx = n \ln n ∫1nxndx=nlnn
2.求1-n的每个数的约数和
很简单! 把上面代码的统计约数个数,改成对约数求和就行
for( int i = 1; i <= n; ++i )// i是约数
for( int j = i ; j <= n; j += i)// i的倍数就是原数
++f[j];
//不包括这个数本身
for( int i = 1; i <= n; ++i )
for( int j = i + i ; j <= n; j += i)
f[j] += i;
时间复杂度
∫ 1 n n x d x = n ln n \int_{1}^{n} \frac{n}{x} dx = n \ln n ∫1nxndx=nlnn
3.求 1-n的每个数的约数对
**以下代码将约数对 (i,j) (j,i) 视为同一种 **
for(int i = 1; i <= sqrt(n); ++ i){//枚举小的那个约数
for(int j = i; i*j <= n; ++j){//再求大的约数
h[i*j].push_back(i);//这里存的约数对里小的那个约数
}
}
** 时间复杂度小于 **
∫ 1 n n x d x = n ln n \int_{1}^{\sqrt{n}} \frac{n}{x} dx = n \ln \sqrt{n} ∫1nxndx=nlnn