zoukankan      html  css  js  c++  java
  • 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
    ",ans[a[i]]-1); ///输出结果需减掉其本身
    
        return 0;
    }    
    View Code
  • 相关阅读:
    Date计算人活了多少天
    微信红包平均分法
    math practise
    Array sort
    static memory management
    java数组中的选择排序
    java数组中的冒泡排序
    数组联系2 模拟酒店系统
    数组练习1(模拟栈)
    二维数组
  • 原文地址:https://www.cnblogs.com/zquzjx/p/8359623.html
Copyright © 2011-2022 走看看