1607 [Usaco2008 Dec]Patting Heads 轻拍牛头

Posted Blue233333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1607 [Usaco2008 Dec]Patting Heads 轻拍牛头相关的知识,希望对你有一定的参考价值。

题目大意:n个数中,对其中每一个数,在其它(n-1)个数中有几个是他的因子。

题解:考虑到数Ai的范围不算太大,可以用一个桶统计1~MAX(Ai)每个数出现个数,然后把1~MAX的在MAX以内的倍数筛一遍即可。100000个数在1000000的桶里非常稀疏,忽略出现次数为0的数对时间效率十分重要。

这题用了筛法,勉强算数论题吧。。。。。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cctype>
 5 #include<iostream>
 6 using namespace std;
 7 #define maxx 1000007
 8 #define maxn 233333
 9 #define ll long long
10 int a[maxn],num[maxx],n,MAX=0;
11 ll f[maxx];
12 int qread()
13 {
14     char c;int s=0,t=1;
15     while (!isdigit(c=getchar())) if (c==\'-\') t=-1;
16     do {s=s*10+c-\'0\';} while (isdigit(c=getchar()));
17     return s*t;
18 }
19 int main()
20 {
21     n=qread();
22     memset(num,0,sizeof(num));
23     for (int i=1;i<=n;i++) a[i]=qread(),num[a[i]]++,MAX=max(a[i],MAX);
24     for (int i=1;i<=MAX;i++)
25         if (num[i]) for (int j=i;j<=MAX;j+=i) f[j]+=num[i];
26     for (int i=1;i<=n;i++) printf("%lld\\n",f[a[i]]-1);
27     return 0;
28 }
View Code

 

以上是关于1607 [Usaco2008 Dec]Patting Heads 轻拍牛头的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

BZOJ1607 [Usaco2008 Dec]Patting Heads

bzoj1607 [Usaco2008 Dec]Patting Heads 轻拍牛头——暴力

bzoj 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头——枚举倍数

BZOJ1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

[BZOJ1607] [Usaco2008 Dec] Patting Heads 轻拍牛头 (数学)