题意很好理解
问你一个数组 按照他的规则处理m次之后是什么样的
看到这道题我一开始也没什么思路
但是我列了五个数
把它们m≤4的都算出来之后发现
如果m把化成二进制的这一位是1
那么所有相隔是这一位数大小的数都要异或起来
然后模拟就好了
(题解中给出了相应的推导证明)
1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(a) cerr<<#a<<"=="<<a<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int> pii; 7 8 const int maxn=2e5+10; 9 10 int n,m; 11 int a[maxn]; 12 13 void solve() 14 { 15 int bits=1; 16 while(bits*2<=m) bits*=2; 17 while(m) 18 { 19 while(m>=bits) 20 { 21 for(int i=bits; i<n; i++) a[i]^=a[i-bits]; 22 m-=bits; 23 } 24 bits/=2; 25 } 26 } 27 28 int main() 29 { 30 int T; 31 scanf("%d",&T); 32 while(T--) 33 { 34 scanf("%d%d",&n,&m); 35 for(int i=0; i<n; i++) 36 { 37 scanf("%d",&a[i]); 38 } 39 solve(); 40 for(int i=0; i<n; i++) 41 { 42 printf("%d%c",a[i],i==n-1?' ':' '); 43 } 44 } 45 return 0; 46 }/* 47 48 2 49 1 1 50 1 51 3 3 52 1 2 3 53 54 */