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 }
弱者究竟为何而战?!