• BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 【筛法】


    题目

    今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.
    贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号奶牛与1号奶牛相邻.农夫约翰用很多纸条装满了一个桶,每一张包含了一个独一无二的1到1,000,000的数字.
    接着每一头奶牛i从柄中取出一张纸条Ai.每头奶牛轮流走上一圈,同时拍打所有编号能整除在纸条上的数字的牛的头,然后做回到原来的位置.牛们希望你帮助他们确定,每一头奶牛需要拍打的牛.

    输入格式

    第1行包含一个整数N,接下来第2到N+1行每行包含一个整数Ai.

    输出格式

    第1到N行,每行的输出表示第i头奶牛要拍打的牛数量.
    

    输入样例

    5 //有五个数,对于任一个数来说,其它的数有多少个是它的约数
    2
    1
    2
    3
    4
    INPUT DETAILS:

    The 5 cows are given the numbers 2, 1, 2, 3, and 4, respectively.

    输出样例

    2
    0
    2
    1
    3
    OUTPUT DETAILS:

    The first cow pats the second and third cows; the second cows pats no cows;
    etc.

    题解

    倍数关系,可以用筛法
    先记下每个值各有几个,再成倍筛选
    复杂度O(nlogn)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
    using namespace std;
    const int maxn = 100005,maxm = 1000005,INF = 1000000000;
    inline int RD(){
        int out = 0,flag = 1; char c = getchar();
        while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
        while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
        return out * flag;
    }
    int cnt[maxm],A[maxn],ans[maxm],N,Max = -1;
    int main(){
        N = RD();
        REP(i,N) A[i] = RD(),Max = max(Max,A[i]),cnt[A[i]]++;
        REP(i,Max)
            if (cnt[i])
                for (int j = i; j <= Max; j += i)
                    ans[j] += cnt[i];
        REP(i,N) printf("%d
    ",ans[A[i]] - 1);
        return 0;
    }
    
  • 相关阅读:
    GridView鼠标悬浮
    GridView控件属性及应用(转载)
    GridView动态绑定按钮
    GridView隐藏列, 并能读取列值的解决方法(转载)
    Oracle语句需要注意的地方
    Oracle数据库创建一个主键ID自增的表
    微软宣布.NET开源:关键软件技术兼容各大平台
    全球排名前50网站都用什么语言开发的?
    钢琴
    SQL函数
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282738.html
Copyright © 2020-2023  润新知