BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头

题目描述有问题,应该对于是每个纸条上的数,有多少个别的纸条上的数是他的约数。

筛法。

记录下每个数出现的次数,然后这个数推后面是他倍数的数。。

 1 #include <cstdio>
 2 #define max(a,b) a>b?a:b
 3 const int maxn = 1000005;
 4 
 5 int cnt[maxn],ans[maxn],a[maxn];
 6 int main()
 7 {
 8     int n;scanf("%d",&n);
 9     int mmax = 0;
10     for(int i = 1;i<=n;++i){
11         scanf("%d",&a[i]);
12         cnt[a[i]]++;
13         mmax = max(mmax,a[i]);
14     }
15     for(int i = 1;i<=mmax;++i)if(cnt[i])
16         for(int j = 1;j*i<=mmax;++j)
17             ans[i*j]+=cnt[i];
18     for(int i = 1;i<=n;++i)
19         printf("%d\n",ans[a[i]]-1);
20     return 0;
21 }

 

posted on 2015-08-06 10:52  round_0  阅读(261)  评论(0编辑  收藏  举报

导航