记录编号 |
394714 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2016]放棋子 |
最终得分 |
100 |
用户昵称 |
HeHe |
是否通过 |
通过 |
代码语言 |
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();
}