记录编号 |
189394 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
[POI 1997] n-k集合数 |
最终得分 |
100 |
用户昵称 |
stdafx.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;
}