记录编号 394714 评测结果 AAAAAAAAAA
题目名称 [HAOI 2016]放棋子 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2017-04-14 09:13:14 内存使用 0.47 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

inline int in(void){
	char tmp = getchar();
	int res = 0;
	while(!isdigit(tmp))tmp = getchar();
	while(isdigit(tmp))
		res = (res + (res << 2) << 1) + (tmp ^ 48),
		tmp = getchar();
	return res;
}

class Bignum{
private:
	short s[400];
	int len;

	void swap(void){
		int i = 0, j = len - 1, tmp;
		while(i < j){
			tmp = s[i], s[i] = s[j], s[j] = tmp;
			++i, --j;
		}
		return ;
	}
public:
	Bignum(){
		memset(s, 0, sizeof(s));
		len = 1;
	}
	Bignum(const int& a){
		*this = a;
	}

	Bignum operator = (int a){ 
		*this = Bignum();
		if(!a)return *this;
		len = 0;
		while(a){
			s[len++] = a % 10;
			a /= 10;
		}
		return *this;
	}

	Bignum operator + (const Bignum& a){
		Bignum b = Bignum();
		b.len = max(len, a.len) + 1;
		for(int i = 0; i < b.len; ++i){
			b.s[i] += s[i] + a.s[i];
			if(b.s[i] > 9){
				b.s[i] -= 10;
				b.s[i + 1] = 1;
			}
		}
		if(!b.s[b.len - 1])b.len -= 1;
		
		return b;
	}

	Bignum operator * (const Bignum& a){
		Bignum b = Bignum();
		b.len = len + a.len;
		for(int i = 0, tmp; i < len; ++i){
			for(int j = 0; j < a.len; ++j){
				b.s[tmp = i + j] += s[i] * a.s[j];
				b.s[tmp + 1] += b.s[tmp] / 10;
				b.s[tmp] %= 10;
			}
		}
		if(!b.s[b.len - 1])b.len -= 1;
		return b;
	}

	void in(void){
		char tmp = getchar();
		*this = Bignum();
		len = 0;
		while(!isdigit(tmp))tmp = getchar();
		while(isdigit(tmp))
			s[len++] = tmp ^ 48, tmp = getchar();
		swap();
		return ;
	}

	void out(void){
		for(int i = len - 1; i >= 0; --i){
			putchar(s[i] ^ 48);
		}
		return ;
	}
};

Bignum f[210];
int N;

int main(){ 
#ifndef LOCAL
	freopen("chess_2016.in", "r", stdin);
	freopen("chess_2016.out", "w", stdout);
#endif
	N = in();
	f[2] = 1;
	for(int i = 3; i <= N; ++i){
		f[i] = Bignum(i - 1) * (f[i - 1] + f[i - 2]);
	}
	f[N].out();
}