算法日记Day4---【题解C++】异或和的累乘

57 阅读1分钟

题目描述

  • 给定 nn 个正整数序列。
  • 定义 xorxorl,rl,r=ala_laal+1l+1⊕...⊕aar1r-1aarr ,⊕为异或运算符号。
  • 求 n∏^ni=1i=1n∏^nj=ij=ixorxorl,rl,r $$ 对1e9+71e9+7取模的值。

我的题解

其实就是按照公式去递推

#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密切相关。具体来说,内部操作被执行的总次数可以表示为(图源网络):

image.png

因此是不会超时滴~