题目
数N能否由某些数的阶乘的合组成
题解思路
很自然的先把每个数的阶乘放到数组里,因为1e6不超过10的阶乘,所以只需取到10的阶乘就行。
这样我们也可以用DFS解决,对每个数的阶乘选择取还是不去,及时剪枝,也能AC。
我们玩点新花样,同样和上一篇博客一样用二进制来枚举这个过程。
对阶乘进行0到2的9次方的枚举,对每个0代表不选择1代表选择,将答案全放进set里,如果N在集合里存在就是对的。
AC代码
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
long long a[20];
map <long long ,int > q;
int main ()
{
long long tmp = 1 ;
a[0] = 1;
for ( int i = 1 ; i < 10 ; i++ )
{
tmp *=i;
a[i] = tmp;
}
for (int i = 0 ; i< 1<<10 ; i++ )
{
long long tmp = 0 ;
for (int k = 0 ; k < 10 ; k++ )
{
if ( i>>k & 1 )
{
tmp+=a[k];
}
}
q[tmp] = 1;
}
long long n;
while(cin>>n)
{
if ( n < 0 )
break;
if ( q[n] == 1 && n!= 0)
{
cout<<"YES\n";
}else
{
cout<<"NO\n";
}
}
return 0;
}