被精心构造卡了long long
AC代码:
#include <bits/stdc++.h>
using namespace std;
long long sum[70];
int main()
{
fill(sum, sum + 66, 0);
long long temp, n;
scanf("%lld", &n);
long long summ = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &temp);
summ += temp;
for (long long j = 59; j >= 0; j--)
if (((long long)1 << j) & temp)
sum[j]++;
}
int q;
scanf("%d", &q);
while (q--)
{
long long tempsumm = summ;
long long m;
scanf("%lld", &m);
long long ans = 0;
for (long long i = 59; i >= 0; i--)
{
if (sum[i] >= n - sum[i])
{
tempsumm -= sum[i] * ((long long)1 << i);
tempsumm += (n - sum[i]) * ((long long)1 << i);
ans += ((long long)1 << i);
}
}
if (tempsumm > m)
{
printf("-1\n");
continue;
}
for (long long i = 59; i >= 0; i--)
{
if (((long long)1 << i) & ans)
continue;
__int128 temp1 = sum[i] * ((__int128)1 << i);
__int128 temp2 = (n - sum[i]) * ((__int128)1 << i);
if (tempsumm + temp2 - temp1 <= m)
{
tempsumm += temp2 - temp1;
ans += ((long long)1 << (i));
}
}
printf("%lld\n", ans);
}
return 0;
}