记录编号 119879 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012]排队 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 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;
}