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

【传送门:BZOJ1607


简要题意:

  给出n个数,求出在其他数中有多少个数为每个数的约数(lydsy的题意好像错了)


题解:

  听说用叫什么筛选的方法QAQ,不会,结果偷窥了神犇,发现常数不大

  就直接用O(k2)的时间复杂度,k为常数

  记录n个数的最大值,然后将n个数不断累积倍数,得到的值的次数加1,然后记录答案,要记得每个数都不能选自己


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1100000];
int s[1100000];
int ans[1100000];
int main()
{
    int n;
    scanf("%d",&n);
    int mmax=0;
    memset(s,0,sizeof(s));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        s[a[i]]++;
        mmax=max(mmax,a[i]);
    }
    for(int i=1;i<=mmax;i++)
    {
        if(s[i]>0)
        {
            for(int j=i;j<=mmax;j+=i)
            {
                ans[j]+=s[i];
            }
        }
    }
    for(int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1);
    return 0;
} 
posted @ 2017-10-06 15:33  Star_Feel  阅读(185)  评论(0编辑  收藏  举报