hdu 6129 Just do it 找规律

题意很好理解

问你一个数组 按照他的规则处理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?'\n':' ');
43         }
44     }
45     return 0;
46 }/*
47 
48 2
49 1 1
50 1
51 3 3
52 1 2 3
53 
54 */

 

posted @ 2017-08-17 11:19  良将ℓ  阅读(367)  评论(0编辑  收藏  举报