「一本通 6.2 练习 2」轻拍牛头

发布时间:2024年01月22日

题目描述

今天是 B e s s i e Bessie Bessie 的生日,并且现在是聚会的游戏时间。 B e s s i e Bessie Bessie 让编号为 1 ? N 1~ N 1?N N N N 头奶牛围成一个圈坐(所以除了最后一头牛,第 i i i 头奶牛与第 i ? 1 i-1 i?1 i + 1 i+1 i+1 头奶牛相邻,第 N N N 头奶牛和第 N ? 1 N-1 N?1 头与第 1 头奶牛相邻)。同时, F a r m e r Farmer Farmer J o h n John John 拿了个桶,在桶里装了十亿张小纸条,每张小纸条上写有某个范围在 [ 1 , 1 0 6 ] [1,10^6] [1,106]的整数。

接着,每头奶牛轮流从这个巨桶中抽取一个数 A i ( 1 ≤ A i ≤ 1 0 6 ) A_i(1≤A_i≤10^6) Ai?(1Ai?106)(当然这些数没必要两两不同)。然后第 i i i 头奶牛走一圈,如果奶牛 i i i 手中的数字能够被奶牛 j ( j ≠ i ) j(j\neq i) j(j=i) 手中的数字整除,那么奶牛 i i i 会拍奶牛 j j j 的头。走完一圈后,奶牛 i i i 回到原来的位置。

奶牛们想让你帮他们计算,对于每头奶牛,它需要拍多少头奶牛的头?

输入输出格式

输入格式:

第一行包含一个整数 N N N
接下来第二到第 N + 1 N+1 N+1 行每行包含一个整数 A i A_i Ai?

输出格式:

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

输入输出样例

输入样例#1:

5
2
1
2
3
4

输出样例#1:

2
0
2
1
3

提示信息

第一头奶牛会拍第二、第三头奶牛,第二头牛不会拍任何奶牛的头,等等。对于全部数据, 1 ≤ N ≤ 1 0 5 1≤N≤10^5 1N105

解法

#include <bits/stdc++.h> 
using namespace std;
const int N=2e5,M=2e6;
int n,a[N],k[M];
int main() {
	cin >>n;
	for (int i=1;i<=n;i++) {
		cin >>a[i];
		k[a[i]]++;
	}
	for (int i=1;i<=n;i++) {
		int tt=0,j;
		for (j=1;j*j<=a[i];j++) {
			if(a[i]%j==0)
				tt+=k[j]+k[a[i]/j];
		}
		j--;
		if (j*j==a[i]) tt-=k[j];
		cout <<tt-1 <<endl;
	}
	return 0;
}
文章来源:https://blog.csdn.net/DUXS11/article/details/135744667
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。