核心思路
只看模 3 的余数即可。一次操作可以把任意位置的数改成 数组中已存在 的某个值,因此我们最终能构造的数组,只由当前数组中出现过的“余数集合” {0,1,2} 决定。
记是否出现过 0,1,2 这三种余数。分类结论:
- 出现了余数 0:把所有数都改成那个余数为 0 的值,总和一定是 3 的倍数 → Yes。
- 仅有余数 1(或仅有余数 2):只能把所有数都变成余数 1(或 2),此时总和余数为
n*1 mod 3(或 2n mod 3),
因而 当且仅当 n % 3 == 0 时为 Yes,否则 No。
P3576.第1题-一二三
题目内容
给定一个长度为n 的整数数组{a1,a2,...,an}。当且仅当数组 a 的所有元素和是3的整数倍时,称该数组为好
的数组。你可以进行如下操作任意次(也可以不进行任何操作)
- 选择两个不同的下标i,j(1≦i,j≦n,i=j),将ai修改为aj。
请判断,是否可以通过若干次上述操作,使数组变为好的数组。
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≦T≦104)代表数据组数,每组测试数据描述如下:
- 第一行输入一个整数n(1≦n≦2×105),表示数组的长度;
- 第二行输入n个整数a1,a2,...,an(1≦ai≦109),表示数组的元素。
除此之外,保证单个测试文件的n之和不超过2×105。
输出描述
对于每一组测试数据,新起一行:若可以通过若干次操作使数组变为好的数组,输出Yes;否则输出 No。大小写需严格一致。
样例1
输入
3
3
1 1 1 1
3
1 2 2
2
1 1
输出
Yes
Yes
No
说明
在这组测试数据中:
第一组:∑ai=3,已是3的整数倍,输出Yes;
第二组:可将a1 修改为a2,得到{2,2,2},元素和为6,输出 Yes;
第三组:只能得到{1,1},元素和为2,无法成为3的整数倍,输出 No