没人写题解我贡献一下:
暴力去写肯定不能AC,
我们不妨将每次组合的第一个数字也标上符号,例如0+2+5 为 +0+2+5,
因为题目是异或优先计算,并且观察发现总会有一正一负的结果互相抵消,
但因为第一位数字永远为正号,所以我们只需要考虑第一位数字与接下来下n位数字一直异或的值然后再相加即可
以下是AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MOD 1000000007
ll pq(ll a,ll b)//快速幂用于计算3的x次方去寻找第n个数字有多少种组合
{
int res = 1;
while(b)
{
if(b & 1)
{
res = (res * a) % MOD;
}
a = (a * a) % MOD;
b >>= 1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
vector<int>vec(n);
for(int i = 0;i < n;i++)
{
cin>>vec[i];
}
ll ans = 0;
ll sum = 0;
for(int i = 0;i < n;i++)
{
sum ^= vec[i];
if(n - i > 1)
{
ans += sum * 2 * pq(3,n - i - 2);//正数一种组合,负数一种组合所以要乘以二
}
else//因为当n - i == 1的时候所有的数字都参与异或运算只有一种可能
{
ans += sum;
}
ans %= MOD;
}
cout<<ans<<endl;
return 0;
}