zoukankan      html  css  js  c++  java
  • BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1607

    题意:

      给你n个数,问你除a[i]之外,有多少个数是a[i]的约数。

    题解:

      ans[i]表示这n个数中有多少个数是i的约数。

      对于a[i],它对它倍数的答案有贡献:ans[a[i]*k]++

      为了提高效率,可以先合并相同的a[i]。

      cnt[i]代表值为i的数字有多少个。

      所以变为:ans[i*k]+=cnt[i]

      枚举每个数的倍数的总复杂度为O(nlogn)(调和级数)。

      最后输出ans[a[i]]-1就好啦(不算自己)。

     

    AC Code:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #define MAX_N 100005
     5 #define MAX_R 1000005
     6 
     7 using namespace std;
     8 
     9 int n;
    10 int a[MAX_N];
    11 int cnt[MAX_R];
    12 int ans[MAX_R];
    13 
    14 int main()
    15 {
    16     scanf("%d",&n);
    17     memset(cnt,0,sizeof(cnt));
    18     memset(ans,0,sizeof(ans));
    19     for(int i=1;i<=n;i++)
    20     {
    21         scanf("%d",&a[i]);
    22         cnt[a[i]]++;
    23     }
    24     for(int i=1;i<MAX_R;i++)
    25     {
    26         if(cnt[i]==0) continue;
    27         for(int j=i;j<MAX_R;j+=i)
    28         {
    29             ans[j]+=cnt[i];
    30         }
    31     }
    32     for(int i=1;i<=n;i++)
    33     {
    34         printf("%d
    ",ans[a[i]]-1);
    35     }
    36 }
  • 相关阅读:
    极验验证(滑动验证)的使用
    from close /destory
    tmeminifile and tinifile
    Delphi的OverRide、OverLoad和Virtual方法
    XE6 FMX之控件绘制与显示
    Delphi Android程序启动过程
    Delphi中的容器类
    接口
    集合
    class methed
  • 原文地址:https://www.cnblogs.com/Leohh/p/7603745.html
Copyright © 2011-2022 走看看