记录编号 278676 评测结果 AAAAAAAAAA
题目名称 [HAOI 2016]放棋子 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2016-07-08 12:34:01 内存使用 0.30 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using std::max;
struct BIG{
	static const int WIDTH=4,BASE=1e4;
	int a[500],sz;
	void p(){
		printf("%d",a[sz]);
		for(int i=sz-1;i>=1;i--) printf("%04d",a[i]);
		printf("\n");
	}
};
void add(const BIG& a,const BIG& b,BIG& c){
	c.sz=max(a.sz,b.sz);
	int i,g;
	for(i=1,g=0;i<=c.sz;i++) {
		g+=a.a[i]+b.a[i];
		c.a[i]=g%BIG::BASE;
		g/=BIG::BASE;
	}
	if(g) c.a[++c.sz]=g;
}
void mult(BIG& a,int b){
	int i,g;
	for(i=1,g=0;i<=a.sz;i++) {
		g+=a.a[i]*b;
		a.a[i]=g%BIG::BASE;
		g/=BIG::BASE;
	}
	while(g) a.a[++a.sz]=g%BIG::BASE,g/=BIG::BASE;
}
BIG a,b,c;
int main(){
	freopen("chess_2016.in","r",stdin);
	freopen("chess_2016.out","w",stdout);
	int n;scanf("%d",&n);
	if(n==1) {
		printf("0");
		return 0;
	}
	else if(n==2) {
		printf("1");
		return 0;
	}
	b.a[1]=b.sz=1;
	for(int i=3;i<=n;i++) {
		add(a,b,c),mult(c,i-1);
		a=b,b=c; 
	//	c.p(); 
	}
	c.p();
}