void got_vars(){ prepareuklad(); try{ solveit(var_number); number cost=0; for(int i=0;i<var_number;i++) cost+=cena[which_var[i]]*solved[i]; if(cost>answer){ for(int d=0;d<m;d++){ number happy=0; for(int i=0;i<var_number;i++) happy+=fun[d][which_var[i]]*solved[i]; if(happy>total[d]) return; } answer=cost; } }catch(int){} }
void solveit(int size){ if(size==1){ if(!uklad[perm[0]][1]) throw 0; solved[0]= uklad[perm[0]][0] / uklad[perm[0]][1]; if(solved[0]<0) throw 0; return; } int bestr=0,r,i; number best=fabs(uklad[perm[0]][size]); for(r=1;r<size;r++) if(fabs(uklad[perm[r]][size])>best){ best=fabs(uklad[perm[r]][size]); bestr=r; } if(!best) throw 0; swap( perm[size-1], perm[bestr] ); number * main_row=uklad[perm[size-1]]; best=main_row[size]; for(r=0;r<size-1;r++){ number * this_row=uklad[perm[r]]; number * ptr=main_row; number factor=this_row[size]/best; if(factor){ for(i=size;i;i--) (*this_row++)-=factor*(*ptr++); } } solveit(size-1); number x=main_row[0]; number * ptr=main_row+1; number * sol=solved; for(i=1;i<size;i++) x-= (*sol++)*(*ptr++); if((solved[size-1]=(x/best))<0) throw 0; }
int main(void){ while(scanf("%lu %lu",&a,&b)!=EOF) solveit(); return 0; }