题目情境#
题目描述
给定一个正整数 ,请输出 中每个数的约数个数 。
例如 时:。
输入格式
输入一行一个正整数 ()。
输出格式
输出一行 个整数,第 个整数表示 ,相邻整数用一个空格隔开。
输入 #1
6plaintext输出 #1
1 2 2 3 2 4plaintext说明/提示
表示 的正因数个数,如 (因数为 )。
算法解析:#
线性筛求约数个数:额外维护 表示 的最小质因子次数。质数 ;合数 :若 则 ,否则 。复杂度 。
Python代码实现#
n = int(input())
p = [0] * (n + 1)
vis = [0] * (n + 1)
a = [0] * (n + 1)
d = [0] * (n + 1)
cnt = 0
d[1] = 1
for i in range(2, n + 1):
if not vis[i]:
cnt += 1; p[cnt] = i
a[i] = 1; d[i] = 2
for j in range(1, n + 1):
if i * p[j] > n:
break
m = i * p[j]
vis[m] = 1
if i % p[j] == 0:
a[m] = a[i] + 1
d[m] = d[i] // a[m] * (a[m] + 1)
break
else:
a[m] = 1
d[m] = d[i] * 2
for i in range(1, n + 1):
print(d[i], end=" ")pythonC++代码实现#
#include <iostream>
using namespace std;
const int N = 1000010;
int p[N], vis[N], cnt;
int a[N]; //a[i]记录i的最小质因子的次数
int d[N]; //d[i]记录i的约数个数
void get_d(int n){ //筛法求约数个数
d[1] = 1;
for(int i=2; i<=n; i++){
if(!vis[i]){
p[++cnt] = i;
a[i] = 1;
d[i] = 2;
}
for(int j=1; i*p[j]<=n; j++){
int m = i*p[j];
vis[m] = 1;
if(i%p[j] == 0){
a[m] = a[i]+1;
d[m] = d[i]/a[m]*(a[m]+1);
break;
}
else{
a[m] = 1;
d[m] = d[i]*2;
}
}
}
}
int main(){
int n;
cin >> n;
get_d(n);
for(int i=1; i<=n; i++)
printf("%d\n", d[i]);
return 0;
}c