记录编号 189394 评测结果 AAAAAAAAAAAAAAA
题目名称 [POI 1997] n-k集合数 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.053 s
提交时间 2015-09-27 16:55:18 内存使用 8.88 MiB
显示代码纯文本
#define MAXL 40UL
#define MAXN 110UL
#define MAXK 410UL

#define MAX(a,b) ((a)>(b)?(a):(b))

#include <cstdio>
#include <cstdlib>
#include <cstring>

struct BigNum{
	int s[MAXL];
	inline void clr(){memset(s,0,sizeof(s));return;}
	inline void setnum(int p){clr();while(p) s[++s[0]]=p%10,p/=10;return;}
	inline void prx(){if(s[0]<1) puts("0");for(int i=s[0];i>0;i--) printf("%d",s[i]);return;}
	friend BigNum operator + (BigNum temp_a,BigNum temp_b){
		BigNum temp_c;int i,*a=temp_a.s,*b=temp_b.s,*c=temp_c.s;
		for(temp_c.clr(),c[0]=MAX(a[0],b[0])+1,i=1;i<c[0];i++) c[i]+=a[i]+b[i],c[i+1]=c[i]/10,c[i]%=10;
		while(!c[c[0]]) --c[0];
		return temp_c;
	}
};

BigNum f[MAXN][MAXK],emp;
bool chk[MAXN][MAXK];

BigNum Cal(int n,int k){
	if(chk[n][k]) return f[n][k];
	if(n<0) return emp;
	chk[n][k]=true;
	return f[n][k]=Cal(n-1,k)+Cal(n-2,MAX(k-n,0));
}

inline void Set(int n,int k,int p){
	chk[n][k]=true;f[n][k].setnum(p);
	return;
}

inline void Pre(){
	Set(1,1,1);Set(2,1,2);Set(2,2,1);Set(1,0,2);Set(2,0,3);
	return;
}

int main(){
	freopen("lic.in","r",stdin);freopen("lic.out","w",stdout);
	int n,k;Pre();emp.setnum(0);
	scanf("%d%d",&n,&k);
	Cal(n,k+1).prx();
	return 0;
}