考虑存在两个解满组条件
一组是 2 k 1 2^{k_1} 2k1和 2 k 2 2^{k_2} 2k2
一组是 2 k 3 2^{k_3} 2k3和 2 k 4 2^{k_4} 2k4
显然有 k 1 ! = k 3 & & k 1 ! = k 4 & & k 2 ! = k 3 & & k 2 ! = k 4 k_1!=k_3\&\&k_1!=k_4\&\&k_2!=k_3\&\&k_2!=k_4 k1!=k3&&k1!=k4&&k2!=k3&&k2!=k4
而又有 2 k 1 + 2 k 2 = 2 k 3 + 2 k 4 2^{k_1}+2^{k_2}=2^{k_3}+2^{k_4} 2k1+2k2=2k3+2k4
有 max ( k 1 , k 2 ) ! = max ( k 3 , k 4 ) \max(k_1,k_2)!=\max(k_3,k_4) max(k1,k2)!=max(k3,k4)
显然,存在有一遍的最大索引更大,那么这一组解的和会比另一组解更大,因为 2 k > 2 0 + 2 1 + 2 2 . . . + 2 k − 1 2^{k}>2^{0}+2^{1}+2^{2}...+2^{k-1} 2k>20+21+22...+2k−1
所以解一定是唯一的,我们先特判掉 n = 1 n=1 n=1
然后不断模拟进位,看最后有几个位置上二进制数为 1 1 1,只要小于等于 2 2 2都是满足条件的
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int n,a[maxn],f[maxn];
int main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) f[a[i]]++;
int suf = 0;
for(int i=0;i<=110000;i++)
{
f[i+1] += f[i]/2;
if( f[i]&1 ) suf++;
}
if( n==1 ) cout << "N";
else if( suf<=2 ) cout << "Y";
else cout << "N";
}