11.05T3 map
4854 -- 【十连赛day2】Divisors
Description
给定 m 个不同的正整数 a1, a2, ..., am,请对 0 到 m 每一个 k 计算,在区间 [1, n] 里有多少正整数是 a 中恰好 k 个数的约数。
Input
第一行包含两个正整数 n, m,分别表示区间范围以及 a 数组的大小。
第二行包含 m 个不同的正整数 a1, a2, ..., am,表示 a 数组。
第二行包含 m 个不同的正整数 a1, a2, ..., am,表示 a 数组。
Output
输出 m + 1 行,每行一个整数,其中第 i 行输出 k = i 的答案。
Sample Input
10 3
4 6 7
Sample Output
4
4
1
1
Hint
【样例输入2】
5 1
8
【样例输出2】
2
3
5 1
8
【样例输出2】
2
3
简单的求一下因数就可以了
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #define N 100005 5 using namespace std; 6 map<long long,long long>check; 7 long long List[N],tot,a[N]; 8 long long num[300]; 9 long long n,m; 10 void pre() { 11 for(long long i=1;i<=m;i++){ 12 for(long long j=1;j*j<=a[i];j++){ 13 if(a[i]%j==0){ 14 if(!check[j])List[++tot]=j; 15 check[j]++; 16 if(j*j!=a[i]){ 17 if(!check[a[i]/j])List[++tot]=a[i]/j; 18 check[a[i]/j]++; 19 } 20 } 21 } 22 } 23 } 24 int main() { 25 cin>>n>>m; 26 for(long long i=1; i<=m; i++)cin>>a[i]; 27 pre(); 28 num[0]=n; 29 for(long long i=1;i<=tot;i++){ 30 if(List[i]>n)continue; 31 num[0]--; 32 num[check[List[i]]]++; 33 } 34 for(long long i=0;i<=m;i++)cout<<num[i]<<'\n'; 35 return 0; 36 }
over