题目描述
- 给定 个正整数序列。
- 定义 =⊕⊕...⊕⊕ ,⊕为异或运算符号。
- 求 $$ 对取模的值。
我的题解
其实就是按照公式去递推
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+5;
const int mod=1e9+7;
ll a[N];
ll prexor[N],prexor_fix[N];
int main()
{
int n;
cin>>n;
prexor_fix[0]=1;
for(int i=1;i<=n;i++) {
cin>>a[i];
prexor[i]=(prexor[i-1]^a[i])%mod;
prexor_fix[i]=(prexor_fix[i-1]*prexor[i])%mod;
}
ll ans=prexor_fix[n];
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
ans=ans*(prexor[i]^prexor[j])%mod;
}
}
cout<<ans<<endl;
return 0;
}
值得注意
可能会有小伙伴疑惑这个二重for循环难道不会超时吗?
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
ans=ans*(prexor[i]^prexor[j])%mod;
}
}
这里第一重循环执行了n次,第二重的循环次数和i密切相关。具体来说,内部操作被执行的总次数可以表示为(图源网络):
因此是不会超时滴~