Link

https://www.acmicpc.net/problem/1437

Detail

딱봐도 DP임 수 a의 분해곱의 최댓값을 라고 한다면

  • a를 두 수 i, j로 나눈다.
  • 중 최대값이 a가 된다. (O(a))
  • a가 100만까지라는데 되냐 이거?

뭔 DP 여 ㅋㅋㅋㅋ

그냥 곱할 수 있는 수를 최대한으로 늘리는 것이 이득 이때 2가 세개인것보다 3이 2개인게 미세하게 크기때문에 (8, 9) 숫자 안에서 3을 최대한 꺼낸 다음에 남아도는 2를 곱해주면 끝.

이 때 3 + 1보다 2 + 2 로 분해하는 것이 이득이기 때문에 n % 3 == 1일경우 2를 두개로 상정하고

싹 곱해주면 결과를 알 수 있다.

Code

#include <bits/stdc++.h>
#define MOD 10007
#define MAX 1'000'000
 
using namespace std;
typedef long long ll;
  
int solve(int n) {
    if(n <= 2) return n;
 
    int threeCnt = n / 3;
    int twoCnt = 0;
 
    if (n % 3 == 1) {
        threeCnt--;
        twoCnt = 2;
    } else if (n % 3 == 2) {
        twoCnt = 1;
    }
 
    int answer = 1;
    for (int i = 0; i < threeCnt; i++) {
        answer *= 3;
        answer %= MOD;
    }
 
    for (int i = 0; i < twoCnt; i++) {
        answer *= 2;
        answer %= MOD;
    }
 
    return answer;
 
}
 
int main() {
    int n; cin >> n;
 
    cout << solve(n);
    return 0;
}