[C.踩不出足迹]
同或结论:假设a与b都是k位二进制数,则a b = a ^ b ^
那么只要把每次的结果与上一次的同或及异或的进行异或或者同或运算即可
#include<bits/stdc++.h> #include<climits> using namespace std; long long m[70]; unsigned long long curr = 4; unsigned long long a; unsigned long long p = 2 * LONG_LONG_MAX + 1; unsigned long long ans1,ans2; unsigned long long f,f1; unsigned long long a1,a2; unsigned long long qpow(unsigned long long a,unsigned long long b) { unsigned long long x = a; unsigned long long ans = 1; while(b) { if(b %2 != 0) ans *= x; ans %= p; x *= x; x %= p; b /= 2; } return ans; } int main(){ int n,k; m[1] = 1; scanf("%d %d",&n,&k); unsigned long long anss = qpow(2,k) - 1; //cout<<p<<endl; //cout<<anss<<endl; scanf("%llu &llu",&a1,&a2); f = a1 ^ a2; f1 = a1 ^ a2 ^ anss; for(int i = 2;i <= n;i ++ ){ scanf("%llu",&a); ans1 = max(a ^ f,a ^ f1); ans2 = max(a ^ f ^ anss,a ^ f1 ^ anss); f = ans1; f1 = ans2; } printf("%llu",max(f,f1)); }