题目:A Different Task
思路:递推。
注意:在用 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-yint 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;
}