https://www.acmicpc.net/problem/2057
음 아닌 정수 N이 주어졌을 때, 이 수를 서로 다른 정수 M(M ≥ 1)개의 팩토리얼의 합으로 나타낼 수 있는지 알아내는 프로그램을 작성하시오. 예를 들어 2=0!+1!로 나타낼 수 있지만, 5는 이와 같은 방식으로 나타낼 수 없다.
첫째 줄에 정수 N이 주어진다.
입력으로 주어진 수를 서로 다른 정수 M개의 팩토리얼의 합으로 나타낼 수 있으면 YES, 없으면 NO를 출력한다.
큰 팩토리얼부터 살펴보면서 그 값이 n보다 작으면 변수 sum에 더해주고 크면 넘어가는 식으로 반복해서 누적합 sum이 n과 같아지는지 비교해본다.
n = int(input())
# 1! ~ 20! 까지 값을 구함
fact = [1, 1]
for i in range(2, 21):
fact.append(fact[i-1]*i)
sum = 0
for i in range(20, -1, -1):
# 20!부터 살펴보면서 팩토리얼 누적 합을 구함
if sum+fact[i] < n:
sum += fact[i]
elif sum+fact[i] == n: # 누적 합이 정수 n과 같은 경우
print("YES")
exit(0)
print("NO")
정수 n의 범위의 최댓값은 21!을 넘지 않으므로 20! 까지만 구하여 fact 안에 넣어준다.
20!부터 n보다 작은 범위인지 판단해준다.
sum+k!이 n보다 작으면 sum에 더해주고, 크면 (k-1)!을 보는 식으로 반복을 진행해준다.
그러다 sum이 정수 n과 같아지는 경우 YES를 출력하고, 반복문을 끝까지 돌렸는데도 n와 같아지는 경우가 없으면 NO를 출력한다.
나는 큰 팩토리얼부터 비교해봤는데 작은 팩토리얼부터 하는 분들도 있었다.