USACO2008 Patting Heads /// 筛数 oj24705
题目大意:
N (1 < N < 100,000)头牛被编号为1-N,围坐成圈
每头牛都被画上数字Ai (1 ≤ Ai ≤ 1,000,000),可能重复
逐个起来拍打 其他身上的数字是 自己身上的数字的约数 的牛包括本身的数字
Input
* Line 1: A single integer: N
* Lines 2..N+1: Line i+1 contains a single integer: Ai
Output
* Lines 1..N: On line i, print a single integer that is the number of other cows patted by cow i.
Sample Input
5
2
1
2
3
4
Sample Output
2
0
2
1
3
用普通的方法 数目太大会越界 结果RE
思路来自 http://blog.csdn.net/wnjxyk/article/details/38946819
类似线性筛数
#include <bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); int a[100005],flag[1000005],m=0,ans[1000005]; memset(flag,0,sizeof(flag)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); flag[a[i]]++; ///记录数字在牛身上出现与否及次数 m=max(m,a[i]); ///选出出现的最大的数 } for(int i=1;i<=m;i++) if(flag[i]) //如果出现 { for(int j=i;j<=m;j+=i) ///到最大数m前i的所有倍数j ans[j]+=flag[i]; ///所有倍数j的结果都加上i出现的次数 } for(int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1); ///输出结果需减掉其本身 return 0; }