Example #1
0
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)];
    }
}
Example #4
0
    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;//
}