1. 程式人生 > >hdu 6129 Just do it 找規律

hdu 6129 Just do it 找規律

-- std div its 題解 turn 個數 using const

題意很好理解

問你一個數組 按照他的規則處理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 */

hdu 6129 Just do it 找規律