题目描述
二进制枚举:
阶乘的和
https://www.acwing.com/problem/content/3484/
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
unordered_set<int> sum;
int f[10];
int main()
{
//求阶乘 9!就够
f[0] = 1;
for(int i = 1;i<10;i++){
f[i] = f[i-1]*i;
}
//位选择
for (int i = 1; i < (1 << 10); i ++ )//9位数的排列,1 - 2^10次方给选择(000……01~111……11) i从一开始 0 不能表示阶乘的和
{
int s = 0;
for(int j = 0;j<10;j++)//每一位是否为一
{
if(i >> j & 1)
s += f[j];
}
sum.insert(s);
}
int n;
while(cin >> n,n>=0){
if(sum.count(n)){
cout << "YES" << endl;
}else{
cout << "NO" << endl;;
}
}
return 0;
}