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