阶乘问题 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 164(82 users) Total Accepted: 87(76 users) Rating: Special Judge: No Description 已知一个正整数n,请问能否将n表示成若干个不同的正整数的阶乘的和。
Input 输入包含多组测试数据。
对于每组测试数据:
第1行,包含一个正整数n (1 ≤ n ≤ 1018)
处理到文件结束
Output 对于每组测试数据:
如果能拆分,则输出YES,否则输出NO
Sample Input 5
7 Sample Output NO
YES
Hint 7 = 1! + 3!
Author 齐达拉图@HRBUST
想到了就不难了。。。 下面是AC代码:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define ll long long #define maxn 1000000000000000000 ll a[105]; int main() { a[1]=1; int le; for(int i=2;i<=105;i++) { a[i]=i*a[i-1]; if(a[i]>=maxn) { le=i-1; break; } } ll n; while(~scanf("%lld",&n)) { for(int i=le;i>=1;i--) { if(a[i]<=n) { n=n-a[i]; } if(n==0) { break; } } if(n==0) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }