K3b::Msf K3bDevice::Track::realAudioLength() const { if( index0() > 0 ) return index0(); else return length(); }
int main() { i64 nup = 10000000000000000LL; //nup = 1000000; i64 ndown = 999999; i64 total = 0; for(unsigned int j = 2; j <= ndown; ++j){ if(j % 1000 == 0) printf("%u %lld\n", j, total); i64 nj = nup/j; string sn(to_string(nj)); //how many digits are there int nsize = sn.size(); vector<vector<int> > vtran; create_states(nj, vtran); vector<long double> vmat; vector<long double> rhs; vector<long double> sol; vmat.resize(nsize*nsize, 0); rhs.resize(nsize, 10); for(unsigned int i = 0; i < vtran.size()-1; ++i){ vmat[index0(nsize, i, i)] = 10; vector<int>& vti = vtran[i]; int zt = 0; for(unsigned int k = 0; k < vti.size()-1; ++k){//the last one is our destination if(vti[k] != 0){ zt += vti[k]; vmat[index0(nsize, i, k)] -= vti[k]; } } assert(zt == 10||(zt==9 && i==(nsize-1))); } gauss_elimination(nsize, vmat); LU(vmat, rhs, sol); for(unsigned int ii = 0; ii<nsize; ++ii){ i64 xtotal = 0; for(unsigned int jj = 0; jj<nsize; ++jj){ xtotal += (i64)(vmat[index0(nsize, ii, jj)]) * (i64)sol[jj]; } assert(xtotal = 10); } i64 ts = sol[0]+0.5; //assert(ts >= 10 && ts < nup); assert(abs(sol[0] - ts) < 1e-4); total += (i64)(sol[0]+1.5-nsize); } printf("%lld\n", total); }
void LU(vector<long double>& a, vector<long double>& rhs, vector<long double>& sol) { int nsize = rhs.size(); sol.clear(); sol.resize(nsize, 0); //forward assert(static_cast<int>(a.size()) == nsize * nsize); vector<long double> y(rhs); //diagonal belongs to upper triangle matirx for(int i = 0 ; i < nsize; ++i){ for(int j = 0; j < i; ++j){ y[i]-= a[index0(nsize, i,j)] * y[j]; } } //backward for(int i = nsize -1 ; i>=0; --i){ for(int j = nsize - 1; j > i; --j){ y[i] -= a[index0(nsize, i, j)] * sol[j]; } sol[i] = y[i]/a[index0(nsize, i, i)]; } }
virtual void end(Voxel& voxel,gz_mat_write& mat_writer) { for(unsigned int index = 0;index < max_length;++index) { std::ostringstream out; out << "pdf_" << index << "um"; mat_writer.write(out.str().c_str(),&*dis[index].begin(),1,dis[index].size()); } for(unsigned int index = 0;index < max_length;++index) { std::ostringstream out; out << "cdf_" << index << "um"; mat_writer.write(out.str().c_str(),&*cdf[index].begin(),1,cdf[index].size()); } mat_writer.write("fa0",&*dis[0].begin(),1,dis[0].size()); std::vector<short> index0(voxel.dim.size()); mat_writer.write("index0",&*index0.begin(),1,index0.size()); }
void gauss_elimination(int n, vector<long double>& a) { assert(static_cast<int>(a.size()) == n * n); for(int i = 0; i < n; ++i){ long double diag = a[index0(n, i, i)]; for(int j = i+1; j < n; ++j){ //first find the aji/aii if(a[index0(n, j, i)]!=0) a[index0(n, j, i)] /= diag; //update jth row for(int k = i+1; k<n; ++k){ a[index0(n, j, k)] -= a[index0(n, j, i)] * a[index0(n,i,k)]; } } } }
int searchGrid(const int total, const vector<int> grid, const vector<int> vflag, const int nset){ if(nset == 16) { for(int row = 0; row < gsize; ++row){ int gs = 0; for(int col = 0; col < gsize; ++col){ gs += grid[index0(gsize, row, col)]; } if(gs != total) return 0; } for(int col = 0; col < gsize; ++col){ int gs = 0; for(int row = 0; row < gsize; ++row){ gs += grid[index0(gsize, row, col)]; } if(gs != total) return 0; } int gs = 0; for(int id = 0; id < gsize; ++id){ gs += grid[index0(gsize, id, id)]; } if(gs != total) return 0; gs =0; for(int id = 0; id <gsize; ++id){ gs += grid[index0(gsize, id, gsize-1-id)]; } if(gs != total) return 0; return 1; } int sum = 0; //which row and col that need to be decided int row = 0, col = 0; unsigned int ix; for(ix = 0; ix < vflag.size(); ++ix) if(vflag[ix] == 0) break; row = ix/gsize; col = ix%gsize; int row_sum = 0, col_sum = 0, diag_sum = 0, adiag_sum=0; int row_vacant = 0, col_vacant = 0, diag_vacant=0, adiag_vacant = 0; row_sum = 0; for(int i = 0; i<gsize; ++i){ int value = grid[index0(gsize, row, i)]; if(value == -1) ++row_vacant; else row_sum += value; } for(int i = 0; i<gsize; ++i){ int value = grid[index0(gsize, i, col)]; if(value == -1) ++col_vacant; else col_sum += value; } assert(vflag[index0(gsize, row, col)] == 0); assert(row_sum <= total); assert(col_sum <= total); //row constrain and col constrain int min = 0, max = 9; int v1 = total - row_sum - (row_vacant-1)*9; max = max < total-row_sum? max: total-row_sum; min = min < v1 ? v1: min; v1 = total - col_sum -(col_vacant - 1)*9; min = min < v1 ? v1: min; max = max < total-col_sum? max: total-col_sum; //diagonal constrain if( row == col ){ for(int i = 0; i < gsize; ++i){ if(grid[index0(gsize, i, i)] == -1){ ++diag_vacant; }else{ diag_sum += grid[index0(gsize, i, i)]; } } assert(diag_vacant >0); v1 = total -diag_sum-(diag_vacant-1) * 9; min = min < v1 ? v1: min; max = max < total-diag_sum? max: total-diag_sum; } //anti diagonal constrain if(row+col == gsize - 1){ for(int i = 0; i < gsize; ++i){ if(grid[index0(gsize, i, gsize-1-i)]==-1){ ++adiag_vacant; }else{ adiag_sum += grid[index0(gsize, i, gsize-1-i)]; } } assert(adiag_vacant > 0); v1 = total - adiag_sum - (adiag_vacant - 1)*9; min = min < v1 ? v1:min; max = max < total-adiag_sum? max: total-adiag_sum; } for(int i = min; i <= max; ++i){ vector<int> f1(vflag), g1(grid); int mset = nset; int index = index0(gsize, row, col); assert(vflag[index] == 0); f1[index] = 1; g1[index] = i; ++mset; if(row_vacant == 2){ int sx = 0, vx = -1; for(int icol = 0; icol < gsize; ++icol){ int index = index0(gsize, row, icol); if(g1[index]== -1){ assert(vx == -1); vx = icol; } else sx += g1[index]; } assert(sx <= total); assert(vx >= 0); f1[index0(gsize, row, vx)] = 1; g1[index0(gsize, row, vx)] = total - sx; ++mset; } if(col_vacant == 2){ int sx = 0, vx = -1; for(int irow = 0; irow < gsize; ++irow){ int index = index0(gsize, irow, col); if(g1[index] == -1){ assert(vx == -1); vx = irow; } else sx += g1[index]; } assert(vx >= 0); assert(sx <= total); f1[index0(gsize, vx, col)] = 1; g1[index0(gsize, vx, col)] = total - sx; ++mset; } if(row == col && diag_vacant == 2){ int sx = 0, vx = -1; for(int id = 0; id < gsize; ++id){ int index = index0(gsize, id, id); if(g1[index] == -1){ assert(vx == -1); vx = id; }else sx += g1[index]; } assert(vx >= 0); assert(sx <= total); f1[index0(gsize, vx, vx)] = 1; g1[index0(gsize, vx, vx)] = total - sx; ++mset; } if(row + col == 3 && adiag_vacant == 2){ int sx = 0, vx = -1; for(int id = 0; id < gsize; ++id){ int index = index0(gsize, id, gsize-1-id); if(g1[index] == -1){ assert(vx == -1); vx = id; }else sx += g1[index]; } assert(vx >= 0); assert(sx <= total); f1[index0(gsize, vx, gsize-1-vx)] = 1; g1[index0(gsize, vx, gsize-1-vx)] = total - sx; ++mset; } sum += searchGrid(total, g1, f1, mset) ; } return sum;// }