阶乘之和
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
-
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
- 输入
- 第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000; - 输出
- 如果符合条件,输出Yes,否则输出No;
- 样例输入
-
2 9 10
- 样例输出
-
Yes No
方法1:贪心12345678910111213141516171819202122232425#include<cstdio>
#include<cstring>
#include<algorithm>
using
namespace
std;
int
fact[12];
void
solve()
{
int
n;
scanf
(
"%d"
,&n);
for
(
int
i=10;i>=1;i--)
if
(n>=fact[i]) n-=fact[i];
if
(n==0)
printf
(
"Yes\n"
);
else
printf
(
"No\n"
);
}
int
main()
{
fact[1]=1;
for
(
int
i=2;i<=10;++i)
fact[i]=fact[i-1]*i;
int
m;
scanf
(
"%d"
,&m);
while
(m--) solve();
}
//贪心策略:每次从10!往下,若n>=fact[i],n-=fact[i]
//x!>(x-1)!+(x-2)!+(x-3)!+...(1)!
方法2:10!已经超过n的最大值
那么只要枚举1!,2!,3!。。。。。10!中任意几个数的和,即枚举1~10的子集
可以用二进制法:
123456789//二进制法枚举子集
void
get_sub(
int
n,
int
s)
{
for
(
int
i=0;i<n;++i)
if
(s&(1<<i)) ans+=fact[i];
}
for
(
int
i=0;i<(1<<n);i++)
get_sub(n,i);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧