만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Squares

시간 제한2초메모리 제한512 MB

요약
n이 최대 10^18일 때, n을 서로 다른 제곱수의 합으로 나타내는 방법 중 가장 큰 밑의 최솟값 k(n)을 구하고, 1부터 n까지 overgrown 정수의 개수를 셉니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 수학, 정수론
정답자
아직 제출이 없습니다

문제

양의 정수를 서로 다른 양의 정수의 제곱들의 합으로 나타내는 것을 분해라고 한다. 예를 들어 30은 분해가 두 가지 있다. 30=12+22+52=12+22+32+4230 = 1^2 + 2^2 + 5^2 = 1^2 + 2^2 + 3^2 + 4^2 이다. 8은 분해가 없다.

k(n)k(n)을 nn의 모든 분해에 대해, 분해에 나타나는 제곱의 밑(제곱하기 전의 정수) 중 최댓값의 최솟값으로 정의한다. nn의 분해가 없으면 k(n)=∞k(n) = \infty이다. 예를 들어 k(1)=1k(1) = 1, k(8)=∞k(8) = \infty, k(30)=4k(30) = 4, k(378)=12k(378) = 12, k(380)=10k(380) = 10이다.

정수 xx에 대해, y>xy > x이고 k(y)<k(x)k(y) < k(x)인 정수 yy가 존재하면 xx를 overgrown이라고 한다. 위 예시에서 378은 overgrown이다.

주어진 nn에 대해 k(n)k(n)과 1 이상 nn 이하의 overgrown 정수의 개수를 구하라.

입력

첫 번째 줄에 정수 nn이 하나 주어진다. (1≤n≤10181 \le n \le 10^{18}) 배점의 45%에 해당하는 테스트는 n≤50 000 000n \le 50\,000\,000을 만족한다. 그중 배점의 30%에 해당하는 테스트는 n≤1 000 000n \le 1\,000\,000을 만족하고, 더 작은 배점 20%의 테스트는 n≤1000n \le 1000을 만족한다.

출력

공백으로 구분된 정수 두 개를 출력한다. 첫 번째는 k(n)k(n)이고, 두 번째는 1 이상 nn 이하의 overgrown 정수의 개수이다. k(n)=∞k(n) = \infty이면 첫 번째 수 대신 마이너스 기호(-)를 출력한다.

예제2

  1. 예제 1

    입력
    30
    
    예상 출력
    4 15
    
  2. 예제 2

    입력
    8
    
    예상 출력
    - 5