삼각수의 개수를 제한하지 않으면 임의의 자연수를 훨씬 더 다양하게 삼각수들의 합으로 표현할 수 있다. 예를 들면, 다음과 같이 4, 5, 6은 각각 3, 4, 7가지 방법으로 표현할 수 있다.
4 = 1 + 1 + 1 + 1
= 1 + 3
= 3 + 1
5 = 1 + 1 + 1 + 1 + 1
= 1 + 1 + 3
= 1 + 3 + 1
= 3 + 1 + 1
6 = 1 + 1 + 1 + 1 + 1 + 1
= 1 + 1 + 1 + 3
= 1 + 1 + 3 + 1
= 1 + 3 + 1 + 1
= 3 + 1 + 1 + 1
= 3 + 3
= 6
여러분들이 할 일은 자연수 n이 입력으로 주어질 때, n을 삼각수들의 합으로 표현할 수 있는 방법을 모두 찾는 것이다.프로그램의 실행시간은 1.0초를 초과할 수 없다.
입력 형식
표준 입력을 통하여 입력한다. 첫째 줄에 양의 정수 n 과 정수 p 가 순서대로 입력된다. p = 1이면 항상 n 이다.
출력 형식
표준 출력을 통하여 출력한다. 첫째 줄에 n을 삼각수들의 합으로 표현할 수 있는 방법의 개수를 10^6으로 나눈 나머지를 출력한다. 만약 p = 1이라면 추가로 둘째 줄부터 마지막 줄까지 n 을 삼각수들의 합으로 표현하는 방법을 한 줄에 하나씩 사전식 순서로 출력한다. 이 때, 덧셈 기호를 생략하고 대신에 빈칸 하나를 넣는다.
입력과 출력의 예 (1)
입력
4 1 |
출력
3 1 1 1 1 1 3 3 1 |
입력과 출력의 예 (2)
입력
5 -1 |
출력
4 |
동적할당인줄 알고 접근했는데 시간초과네요...ㅜㅜ
짠 코드는 https://slexy.org/view/s215x7G7XU 이거임니다
중간 중간 printf는 그냥 값맞나 확인할려고 찍어놓은거에요...
일단 문제가 옮기면서 깨진거 같고 (e.g. p = 1 이면 항상 n이다 ?) 동적 할당이 아니라 동적 프로그래밍 (DP) 이고 작성한 프로그램은 P가 1일때 고려를 안했고 N 크기 제한이 없음
그리고 i - arr[j]가 음수가 되는 경우가 있는데 그걸 고려를 해야할듯. 1000000으로 나눈 나머지를 구할때 굳이 > 1000000 체크 해줄 필요 없음. 오히려 저 체크때문에 답이 정확히 1000000면 올바르지 않는 값이 나오게 됨
i < n + 1은 왜 있는지 모르겠고 (i <= n),
n <= 100000 , p =1이면 항상 n<30이다 이거ㅇ임니다
근데 중요한건 N값에 100000이 들어가면 1초내에 절대 안나와요
저런식으로 짯을때 1일때 출력값을 어떻게 구해야 할지 전혀 모르겠어요 arr[i]을 여러번 더하다가 N 이랑 같아지면 브레이크 하고 다음 인덱스로 넘어가는 식인가 했는데 그러면 1+1+3같은 경우 체크가 안되고..
가짓수 구하는건 점화식으로 어뜨케 구하겠는데 저 합을 출력하는건 어뜨케 해야하는지..
재귀호출로 전수탐색 하시면 될듯
시간복잡도를 O(N sqrt(N))에서 더 줄이는 법을 모르겠는데 흠