记录编号 |
119879 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2012]排队 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.711 s |
提交时间 |
2014-09-14 18:07:25 |
内存使用 |
0.28 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZEL=40010,BASE=10000;
class HP{
public:
int len;
int s[SIZEL];
void print(void){
printf("%d",s[len-1]);
for(int i=len-2;i>=0;i--) printf("%04d",s[i]);
}
void clear(void){
len=1;
memset(s,0,sizeof(s));
}
HP(){clear();}
void operator += (HP &b){
len=max(len,b.len);
int i;
for(i=0;i<len||s[i];i++){
s[i]+=b.s[i];
s[i+1]+=s[i]/BASE;
s[i]%=BASE;
}
if(i>len) len=i;
while(len>1&&!s[len-1]) len--;
}
void operator -= (HP &b){
for(int i=0;i<len;i++){
s[i]-=b.s[i];
while(s[i]<0) s[i+1]--,s[i]+=BASE;
}
while(len>1&&!s[len-1]) len--;
}
void operator *= (int b){
int i;
for(i=0;i<len;i++) s[i]*=b;
for(i=0;i<len||s[i];i++){
s[i+1]+=s[i]/BASE;
s[i]%=BASE;
}
if(i>len) len=i;
while(len>1&&!s[len-1]) len--;
}
void operator *= (HP &b){
int c[SIZEL]={0};
for(int i=0;i<len;i++){
for(int j=0;i<b.len;j++){
c[i+j]+=s[i]*b.s[j];
c[i+j+1]+=c[i+j]/BASE;
c[i+j]%=BASE;
}
}
memcpy(s,c,sizeof(s));
len+=b.len+1;
while(len>1&&!s[len-1]) len--;
}
};
const int SIZEN=2010;
void cmul(HP &a,int l,int r){//连续的乘上一些数
for(int i=l;i<=r;i++) a*=i;
}
int N,M;
void work(void){
if(N+2-M+1<0){
printf("0\n");
return;
}
HP A,B;//老师可邻,老师必邻
A.len=B.len=1;A.s[0]=1;B.s[0]=2;//注意开始B=2
cmul(A,1,N+2);
cmul(A,N+3-M+1,N+3);
cmul(B,1,N+1);
cmul(B,N+2-M+1,N+2);
A-=B;
A.print();printf("\n");
}
int main(){
freopen("bzoj_2729.in","r",stdin);
freopen("bzoj_2729.out","w",stdout);
scanf("%d%d",&N,&M);
work();
return 0;
}