//因为10的阶乘就已经很大了,所以阶乘能选的数字很少 #include <iostream> #include <cstring> #include <algorithm> using namespace std; //还有个0的阶乘别忘了所以有两个1可以用 int a[] = {1,1, 2, 6,42,1806,3263442};//存下所有阶乘之后开始暴搜 bool visit[8]; bool dfs(int sum, int aim) { if (sum > aim)return false; if (sum == aim)return true; bool isfind = false;//代表当层是否有答案 for (int i = 0; i < 6; i++) { if (!visit[i]) { //该阶乘没有被选过 visit[i] = true; if (dfs(sum + a[i], aim)) { //找到结果 isfind = true; } visit[i] = false; } } return isfind; } int main() { // long long n=1; // while(n<1e9){ // cout<<n<<','; // n*=(n+1); // } int n; while (cin >> n) { if (n < 0)break; if (dfs(0, n))puts("YES"); else puts("NO"); } }