记录编号 119329 评测结果 AAAAAAAAAAA
题目名称 [POI 2000] 画家的工作室 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.042 s
提交时间 2014-09-11 22:16:36 内存使用 0.29 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<deque>
using namespace std;
typedef long long LL;
const int SIZEL=30,SIZEN=110,BASE=10000;
class HP{//高精
public:
	int len;
	int s[SIZEL];
	void clear(void){len=1,memset(s,0,sizeof(s));}
	HP(){clear();}
	void print(void){
		printf("%d",s[len-1]);
		for(int i=len-2;i>=0;i--) printf("%04d",s[i]);
	}
	void operator = (int x){len=1;s[0]=x;}
	void operator += (HP &b){
		len=max(len,b.len);
		int i;
		for(i=0;i<len||s[i];i++){
			s[i]+=b.s[i];
			s[i+1]+=s[i]/BASE;
			s[i]%=BASE;
		}
		if(i>len) len=i;
		while(len>1&&!s[len-1]) len--;
	}
};
void turn_bin(LL x,int *t){
	//从低位到高位存
	int tot=0;
	while(x){
		t[++tot]=x&1;
		x>>=1;
	}
}
LL N,X,Y;
int BX[SIZEN]={0},BY[SIZEN]={0};
int B[SIZEN]={0};
HP f[4],g[4];
//保持:任一位的X,Y都不是(0,1)
void work(void){
	g[0]=1;
	for(int i=1;i<=N;i++){
		for(int i=0;i<4;i++) f[i].clear();
		for(int s=0;s<4;s++){
			for(int t=0;t<4;t++){
				//这一位的X,Y是s,先前的X,Y将为此贡献t
				if(s==1||(s^B[i]^t)==1) continue;
				int nx=((s/2+B[i]/2+t/2)>>1);
				int ny=((s%2+B[i]%2+t%2)>>1);
				f[(nx<<1)|ny]+=g[t];
			}
		}
		memcpy(g,f,sizeof(g));
	}
	f[0].print();
	printf("\n");
}
int main(void){
	freopen("mal.in","r",stdin);
	freopen("mal.out","w",stdout);
	scanf("%lld%lld%lld",&N,&X,&Y);
	turn_bin(X,BX),turn_bin(Y,BY);
	for(int i=1;i<=N;i++) B[i]=(BX[i]<<1)|BY[i];
	work();
	return 0;
}