#include #include #define D 5000 struct cislo { int dig[D]; int dn; }; struct cislo K[101][101]; int buf[512][128]; int bufs; void print(struct cislo *C) { int k; /* printf("%d ",C->dn); */ printf("%d",C->dig[C->dn-1]); for (k=C->dn-2; k>=0; k--) printf("%03d",C->dig[k]); } void mul(struct cislo *C1,struct cislo *C2,struct cislo *C3) { int i,j,over; C3->dn=C1->dn+C2->dn-1; for (i=0; idn+C2->dn-1; i++) C3->dig[i]=0; /* printf("DEB: called %d %d\n",C1->dn,C2->dn); */ for (i=0; idn; i++) for (j=0; jdn; j++) C3->dig[i+j]+=C1->dig[i]*C2->dig[j]; over=0; /* print(C3); */ for (i=0; over||(idn); i++) { if (i==C3->dn) C3->dig[C3->dn++]=0; C3->dig[i]+=over; over=C3->dig[i]/1000; C3->dig[i]%=1000; } } void mulS(struct cislo *C, int k) { int i,over; over=0; for (i=0; idn; i++) { C->dig[i]*=k; C->dig[i]+=over; over=(C->dig[i])/1000; C->dig[i]%=1000; } if (over) C->dig[C->dn++]=over; } void mulD(struct cislo *C, int k) { int i,over; if (k==1) return; over=0; for (i=C->dn-1; i>=0; i--) { C->dig[i]+=1000*over; over=C->dig[i]%k; C->dig[i]/=k; } for (i=C->dn-1; (i>0)&&(C->dig[i]==0); i--); C->dn=i+1; } void init(void) { int i,j,k; for (i=0; i<=100; i++) for (j=0; j<=i; j++) { K[i][j].dig[0]=1; K[i][j].dn=1; for (k=0; kdn; i++) C->dg[i]=K[l1+l2][l1]->dg[i]; C->dn=K[l1+l2][l1]->dn; */ if (l1==0) { C1.dn=1; C1.dig[0]=1; } else compute(&C1,b1,l1); if (l2==0) { C2.dn=1; C2.dig[0]=1; } else compute(&C2,b2,l2); mul(&K[l1+l2][l1],&C1,&C0); mul(&C0,&C2,C); /* printf("DEB: "); print(&K[l1+l2][l1]); printf(" "); print(&C1); printf(" "); print(&C2); printf(" "); print(&C0); printf("\n"); for (i=0; i