比赛 防止浮躁的小练习v0.9 评测结果 AAAAAAAAAA
题目名称 放棋子 最终得分 100
用户昵称 Lethur 运行时间 0.026 s
代码语言 C++ 内存使用 0.24 MiB
提交时间 2016-11-07 20:00:38
显示代码纯文本
#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();
    return 0;
}