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 数组。

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
 
 
 
简单的求一下因数就可以了
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

posted @ 2018-11-05 21:57  saionjisekai  阅读(221)  评论(0编辑  收藏  举报