BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1607
题意概括
给出n个数,每一个数字<1000000,对于每一个数,让你求剩余的n-1个数中有多少是它的约数。
题解
用桶计数,弄出每一个数字的出现次数。
然后用类似筛法的方法,把每一个数字的倍数都加一下即可。
代码
#include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; const int N=100000+5,M=1000000+5; int n,m=1000000,a[N],tot[M],ans[M]; int main(){ scanf("%d",&n); memset(tot,0,sizeof tot); memset(ans,0,sizeof ans); for (int i=1;i<=n;i++){ scanf("%d",&a[i]); tot[a[i]]++; } for (int i=1;i<=m;i++) if (tot[i]>0) for (int j=i;j<=m;j+=i) ans[j]+=tot[i]; for (int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1); return 0; }