1. 程式人生 > >5935. 小凱學數學

5935. 小凱學數學

Description

        由於小凱上次在找零問題上的疑惑,給大家在考場上帶來了很大的麻煩,他決心好好學習數學
        本次他挑選了位運算專題進行研究 他發明了一種叫做“小凱運算”的運算子:
        a$b =( (a&b) + (a|b) )>>1
        他為了練習,寫了n個數在黑板上(記為a[i]) 並對任意相鄰兩個數進行“小凱運算”,把兩數擦去,把結果留下 這樣操作n-1次之後就只剩了1個數,求這個數可能是什麼?
        將答案從小到大順序輸出
 

Input

4
1 4 3 2

Output

1 2
 

Sample Input

4
1 4 3 2

Sample Output

1 2
 做法:可 進行區間 dp f[i][j][k]代表 i 到 j 的區間是否可能結果為 k 
 1
#include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define N 157 5 #define rep(i,a,b) for(int i=a;i<=b;i++) 6 using namespace std; 7 bool f[N][N][8]; 8 int n,a[N]; 9 10 void Init(){ 11 scanf("%d",&n); 12 rep(i,1,n) scanf("%d",&a[i]); 13 }
14 15 void Work(){ 16 rep(i,1,n) f[i][i][a[i]]=1; 17 18 for(int i=n;i>=1;i--) 19 rep(j,i+1,n) 20 rep(k,i,j) 21 rep(x,0,7) 22 rep(y,0,7) 23 f[i][j][(x+y)/2]=f[i][j][(x+y)/2] | (f[i][k][x]&f[k+1][j][y]); 24 25 rep(i,0,7) 26 if (f[1][n][i]) printf("%d ",i); 27 } 28 29 int main(){ 30 freopen("math.in","r",stdin); 31 freopen("math.out","w",stdout); 32 Init(); 33 Work(); 34 }
View Code