int findIntegers(int num) { static unordered_map<int, int> m{{0, 1}, {1, 2}}; if(m.count(num) == 0) { int len = log2(num) + 1; bool shouldBreak = false; int res = 0; for(int i = 0; i < len; ++i) { if(shouldBreak) break; if(num & (1 << (len - i - 1))) { res += findIntegers((1 << len - i - 1) - 1); if(i != 0 && num & (1 << (len - i))) { shouldBreak = true; } } else { res += findIntegers(num & ((1 << len - i) - 1)); break; } } m[num] = res; } return m[num]; }
int main() { int i = 0; for (i = 0; i < 20; i++) { printf("\r\n num %d = %d",i ,findIntegers(i)); } return 0; }
int main() { int N = 100, a = 2, b = 3; std::vector<bool> vec(N, false); findIntegers(vec, a, b, N); for (int i = 0; i < N; i++) { if (vec[i]) { std::cout << i << std::endl; } } return 0; }
//############################################################################# // Initial solve and find integers bool DcModel::setupSelf() { bool feasible = true; solver_->messageHandler()->setLogLevel(0); initialSolve(); sharedBasis_ = dynamic_cast<CoinWarmStartBasis*> (solver_->getWarmStart()); # ifdef DC_DEBUG_MORE std::string problemName; solver_->getStrParam(OsiProbName, problemName); printf("Problem name - %s\n", problemName.c_str()); solver_->setHintParam(OsiDoReducePrint, false, OsiHintDo, 0); # endif status_ = 0; findIntegers(true); bestObjective_ = 1.0e50; double direction = solver_->getObjSense(); int numberColumns = getNumCols(); if (!currentSolution_) currentSolution_ = new double[numberColumns]; //continuousSolver_ = solver_->clone(); numberRowsAtContinuous_ = getNumRows(); maximumNumberCuts_ = 0; currentNumberCuts_ = 0; // FIXME: return feasible; }