题目翻译
我们有一个长度为 $n$ 的数组,操作若干次以下操作,能否使数组总和不会变小,能的话请输出数组。
- 找到 $a_i$ 和 $a_j$ 且 $i\neq j$。
- $a_i = a_j = \left|a_i-a_j\right|$。
题目思路
不会变小,我们尽可能保证是相等,因为 $a_i\leq10^9$。
那么 $\left|a_i-a_j\right|\times2=a_i+a_j$。
那么很容易想到了,$a_i$ 与 $a_j$ 是 $3$ 倍的关系。
我们只要判断,多少个 $3$ 相乘 $\leq10^9$。
那么应该是 $3^{18}=387420489$。
再加上开始的 $1$,所以数组有 $19$ 位,$n\leq19$ 是 YES
,否则是 NO
。
题目代码
//我这边是打表找出所有数的,也可以把这些数据在程序中算出来。
ll a[]={1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907,43046721,129140163,387420489};
void solve()
{
int n;
cin>>n;
if(n<=19)
{
puts("YES");
for(int i=1;i<=n;i++)
{
cout<<a[i-1]<<" ";
}
cout<<endl;
}
else
{
puts("NO");
}
}