solve complex problems