#zSybttg060203. 1621:轻拍牛头

1621:轻拍牛头

1621:轻拍牛头

题目描述

原题来自:USACO 2008 Dec. Silver

今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。

贝茜让 NN 头奶牛坐成一个圈。除了 11 号与 NN 号奶牛外,ii 号奶牛与 i1i-1 号和 i+1i+1 号奶牛相邻,NN 号奶牛与 11 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包含了一个 1110610^6 的数字。

接着每一头奶牛 ii 从桶中取出一张纸条 AiA_i,每头奶牛轮流走一圈,同时拍打所有「抽到字条数字是 AiA_i 的因数」的牛,然后走回到原来的位置。牛们希望你帮助他们确定,每一头奶牛需要拍打的牛。

输入格式

第一行包含一个整数 NN

接下来第二到第 N+1N+1 行每行包含一个整数 AiA_i

输出格式

第一到第 NN 行,第 ii 行的输出表示第 ii 头奶牛要拍打的牛数量。

样例

样例输入 #1

5
2
1
2
3
4

样例输出 #1

2
0
2
1
3

样例解释 #1

  • N=5N=5 头奶牛,抽到的数字分别为 2,1,2,3,42,1,2,3,4
  • 奶牛 11 抽到 22,需要拍打所有抽到数字是 22 的因数的奶牛。22 的因数为 1122,所以抽到 1122 的奶牛都要被拍打。抽到 11 的是奶牛 22,抽到 22 的是奶牛 1133,但拍打不包括自己(因为自己拍自己?题目说“拍打所有抽到字条数字是 AiA_i 的因数的牛”,应该包括自己吗?样例中奶牛 11 输出 22,说明不包括自己,因为如果包括自己,则奶牛 11 抽到 22,因数有 1122,抽到 11 的奶牛 22,抽到 22 的奶牛 1133,共 33 头,但输出是 22,说明排除了自己。所以拍打的对象是其他奶牛。
  • 因此,奶牛 11 拍打奶牛 22(抽到 11)和奶牛 33(抽到 22),共 22 头。
  • 奶牛 22 抽到 1111 的因数只有 11,所以拍打所有抽到 11 的奶牛(除了自己)。只有奶牛 22 抽到 11,所以拍打 00 头。
  • 奶牛 33 抽到 22,同奶牛 11,拍打奶牛 1122,共 22 头。
  • 奶牛 44 抽到 3333 的因数为 1133,拍打抽到 11 的奶牛 22 和抽到 33 的奶牛 44(自己排除),所以只拍打奶牛 22,共 11 头。
  • 奶牛 55 抽到 4444 的因数为 1,2,41,2,4,拍打抽到 11 的奶牛 22,抽到 22 的奶牛 1133,抽到 44 的奶牛 55(自己排除),所以拍打奶牛 1,2,31,2,3,共 33 头。

数据范围

对于全部数据,1N1051 \le N \le 10^51Ai1061 \le A_i \le 10^6

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题需要对于每个 AiA_i,统计有多少个 AjA_jjij \ne i)是 AiA_i 的因数。直接枚举每个数的因数复杂度 O(NAi)O(N \sqrt{A_i}) 可能超时。因为 Ai106A_i \le 10^6,我们可以用桶计数,然后对于每个数字 xx,枚举 xx 的所有倍数 yy,将 xx 的贡献加到 yy 上。具体地:

  1. 用数组 cnt[x] 记录数字 xx 出现的次数。
  2. 用数组 ans[x] 记录抽到数字 xx 的奶牛需要拍打的牛数量(不包括自己)。
  3. 对于每个 xx,枚举 xx 的所有倍数 yyy106y \le 10^6),则 xxyy 的因数,所以抽到 yy 的奶牛需要拍打所有抽到 xx 的奶牛。因此 ans[y] += cnt[x]
  4. 最后对于每个 AiA_i,输出 ans[A_i] - 1(因为减掉自己)。

时间复杂度:O(MlogM)O(M \log M),其中 M=106M = 10^6,因为枚举倍数总和约为 MlogMM \log M