博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阶乘之和
阅读量:6816 次
发布时间:2019-06-26

本文共 878 字,大约阅读时间需要 2 分钟。

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2910
样例输出
YesNo 方法1:贪心
#include
#include
#include
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的子集

可以用二进制法:

//二进制法枚举子集void get_sub(int n,int s){    for(int  i=0;i

 

转载于:https://www.cnblogs.com/orchidzjl/p/4371283.html

你可能感兴趣的文章
【01】KVM中小企业实践-概述
查看>>
SVN与Apache整合
查看>>
xml帮助提示
查看>>
assoc 和 ftype
查看>>
搭建mysql主从服务器
查看>>
linux下查看和修改文件时间
查看>>
我的友情链接
查看>>
linux资源分配Cgroup用法
查看>>
圆包含最多点问题
查看>>
Windows 8.1 发布了一个称为“Defender”的新模块
查看>>
浅析apache调优
查看>>
我的友情链接
查看>>
【Linux】如何正确安装Tomcat
查看>>
010-电脑软件安装手册-20190418
查看>>
linux学习笔记四(shell编程二)
查看>>
Hbase Shell 基础和常用命令
查看>>
数据结构和算法
查看>>
Linux_haproxy(3)v1.0
查看>>
Linux HA Cluster高可用集群之HeartBeat2
查看>>
C#中使用GetCursorPos获取屏幕坐标
查看>>