Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <memory.h>
- #define N 10001
- #define P 10000
- struct bigint{
- int sz;
- int a[777];
- bigint(int x=0){
- sz=0;
- memset(a,0,sizeof(a));
- while (x){
- a[++sz]=x%P;
- x/=P;
- }
- if (!sz) ++sz;
- }
- int & operator [] (int x){
- return a[x];
- }
- void print(){
- printf("%d",a[sz]);
- for (int i=sz-1;i>=1;i--) printf("%.4d",a[i]);
- printf("\n");
- }
- } f[N],t(1);
- int n,k;
- bigint operator + (bigint & a,bigint & b){
- bigint res;
- int k=a.sz>b.sz?a.sz:b.sz;
- for (int i=1;i<=k;i++){
- res[i]+=a[i]+b[i];
- res[i+1]=res[i]/P;
- res[i]%=P;
- }
- if (res[k+1]) ++k;
- res.sz=k;
- return res;
- }
- bigint operator - (bigint &a,bigint &b){
- bigint res;
- int k=a.sz;
- for (int i=1;i<=k;i++){
- res[i]+=a[i]-b[i];
- if (res[i]<0){
- res[i]+=P;
- res[i+1]--;
- }
- }
- while (res[k]==0) --k;
- res.sz=k;
- return res;
- }
- int main(){
- scanf("%d%d",&n,&k);f[0]=bigint(1);
- if (k==0){
- printf("1\n");
- return 0;
- }
- for (int i=1;i<=n;i++){
- if (i<=k) f[i]=f[i-1]+f[i-1];
- else if (i==k+1){
- f[i]=f[i-1]+f[i-1];
- f[i]=f[i]-t;
- }
- else{
- f[i]=f[i-1]+f[i-1];
- f[i]=f[i]-f[i-k-2];
- }
- }
- f[n].print();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment