Very tricky problem, failed to finished by self