阶乘之和
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
-
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
- 输入
- 第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000; 输出 - 如果符合条件,输出Yes,否则输出No; 样例输入
-
2910
样例输出 -
YesNo
-
-
代码
-
DFS
-
#include<stdio.h>
02.
#include<string.h>
03.
#include<algorithm>
04.
#include<queue>
05.
#include<stack>
06.
#include<math.h>
07.
#include<vector>
08.
#define inf 0x3f3f3f
09.
#define PI acos(-1);
10.
#define LL long long
11.
#define M 11
12.
#define mod 1000000
13.
using
namespace
std;
14.
int
num[M]={0};
15.
int
n;
16.
17.
int
flage;
18.
void
dfs(
int
j,
int
sum)
19.
{
20.
if
(sum==n)
21.
{
22.
flage=1;
23.
return
;
24.
}
25.
for
(
int
i=j+1;sum<n&&i<M;i++)
26.
{
27.
dfs(i,sum+num[i]);
28.
}
29.
}
30.
int
main()
31.
{
32.
int
t;
33.
scanf
(
"%d"
,&t);
34.
int
s=1;
35.
for
(
int
i=1;i<M;i++)
36.
{
37.
s=s*i;
38.
num[i]=s;
39.
40.
}
41.
while
(t--)
42.
{
43.
scanf
(
"%d"
,&n);
44.
flage=0;
45.
dfs(0,0);
46.
if
(flage)
printf
(
"Yes\n"
);
47.
else
printf
(
"No\n"
);
48.
}
49.
return
0;
50.
}
-
贪心
-
#include<iostream>
02.
using
namespace
std;
03.
04.
int
main()
05.
{
06.
int
n;
07.
int
k[9]={1,2,6,24,120,720,5040,40320,362880};
08.
cin>>n;
09.
while
(n--)
10.
{
11.
bool
flag=
false
;
12.
int
m;
13.
cin>>m;
14.
for
(
int
i=8;i>=0;i--)
15.
{
16.
if
(m>=k[i] && m>0)
17.
m-=k[i];
18.
if
(m==0)
19.
flag=
true
;
20.
}
21.
if
(flag)
22.
cout<<
"Yes"
<<endl;
23.
else
24.
cout<<
"No"
<<endl;
25.
}
26.
}
- 第一行有一个整数0<m<100,表示有m组测试数据;