#zSybttg060203. 1621:轻拍牛头
1621:轻拍牛头
1621:轻拍牛头
题目描述
原题来自:USACO 2008 Dec. Silver
今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。
贝茜让 头奶牛坐成一个圈。除了 号与 号奶牛外, 号奶牛与 号和 号奶牛相邻, 号奶牛与 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包含了一个 到 的数字。
接着每一头奶牛 从桶中取出一张纸条 ,每头奶牛轮流走一圈,同时拍打所有「抽到字条数字是 的因数」的牛,然后走回到原来的位置。牛们希望你帮助他们确定,每一头奶牛需要拍打的牛。
输入格式
第一行包含一个整数 ;
接下来第二到第 行每行包含一个整数 。
输出格式
第一到第 行,第 行的输出表示第 头奶牛要拍打的牛数量。
样例
样例输入 #1
5
2
1
2
3
4
样例输出 #1
2
0
2
1
3
样例解释 #1
- 头奶牛,抽到的数字分别为 。
- 奶牛 抽到 ,需要拍打所有抽到数字是 的因数的奶牛。 的因数为 和 ,所以抽到 或 的奶牛都要被拍打。抽到 的是奶牛 ,抽到 的是奶牛 和 ,但拍打不包括自己(因为自己拍自己?题目说“拍打所有抽到字条数字是 的因数的牛”,应该包括自己吗?样例中奶牛 输出 ,说明不包括自己,因为如果包括自己,则奶牛 抽到 ,因数有 和 ,抽到 的奶牛 ,抽到 的奶牛 和 ,共 头,但输出是 ,说明排除了自己。所以拍打的对象是其他奶牛。
- 因此,奶牛 拍打奶牛 (抽到 )和奶牛 (抽到 ),共 头。
- 奶牛 抽到 , 的因数只有 ,所以拍打所有抽到 的奶牛(除了自己)。只有奶牛 抽到 ,所以拍打 头。
- 奶牛 抽到 ,同奶牛 ,拍打奶牛 和 ,共 头。
- 奶牛 抽到 , 的因数为 和 ,拍打抽到 的奶牛 和抽到 的奶牛 (自己排除),所以只拍打奶牛 ,共 头。
- 奶牛 抽到 , 的因数为 ,拍打抽到 的奶牛 ,抽到 的奶牛 和 ,抽到 的奶牛 (自己排除),所以拍打奶牛 ,共 头。
数据范围
对于全部数据,,。
时空限制
- 时间限制:1000 ms
- 内存限制:524288 KB
注意:本题需要对于每个 ,统计有多少个 ()是 的因数。直接枚举每个数的因数复杂度 可能超时。因为 ,我们可以用桶计数,然后对于每个数字 ,枚举 的所有倍数 ,将 的贡献加到 上。具体地:
- 用数组
cnt[x]记录数字 出现的次数。 - 用数组
ans[x]记录抽到数字 的奶牛需要拍打的牛数量(不包括自己)。 - 对于每个 ,枚举 的所有倍数 (),则 是 的因数,所以抽到 的奶牛需要拍打所有抽到 的奶牛。因此
ans[y] += cnt[x]。 - 最后对于每个 ,输出
ans[A_i] - 1(因为减掉自己)。
时间复杂度:,其中 ,因为枚举倍数总和约为 。