思路:递推。
注意:在用 long long 实现左移的位运算时,要写 1LL<<x,而不是1<<x。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
#define maxn 60
#define ll long long
#define other(x,y) 6-x-y
int n;
int a[maxn+5]={0},b[maxn+5]={0};
ll f(int* p,int x,int fnl){
if(x==0) return 0;
if(p[x]==fnl) return f(p,x-1,fnl);
return f(p,x-1,other(p[x],fnl))+(1LL<<x-1);
}
int main() {
int T=0;
while(~scanf("%d",&n)&&n){
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
int p=0;
for(int i=n;i>=1;i--){
if(a[i]!=b[i]) {
p=i;
break;
}
}
printf("Case %d: ",++T);
if(p){
printf("%lld\n",f(a,p-1,other(a[p],b[p]))+f(b,p-1,other(a[p],b[p]))+1);
} else printf("0\n");
}
return 0;
}