강의로 돌아가기
진성호

하나하나 개수를 세어가는 법으로 해도 테스트 케이스가 다 틀리네요 ㅠㅠ

아마 나머지를 구하는 쪽에서 오류가 나는것 같은데..... 값이 너무 크다보니 건들어 볼 수가 없네요 ㅠㅠ
그렇다고 double같은 걸로 하면 또 값이 몇씩 차이가 나고 ㅠㅠ 어떻게 해야 할까요

작성중인 코드―solution.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <string>
#include <vector>
#include <cmath>
#include <iostream>

using namespace std;

int fac(int b);

vector<int> arr;

int solution(int n) 
{
    int answer = 0;
    int tmp;
    int two, four;
    vector<int> a(5001, 0);
    arr = a;
    arr[1] = 1;

    if(n % 2 == 0)
    {
        two = n / 2;
        four = 0;
    }
    else
        return 0;

    while(two >= 0)
    {
        if(two == 0 || four == 0)
            tmp = 1;
        else
            tmp = fac(two + four) / (fac(two) * fac(four));

        tmp *= (int)pow(2, four) * (int)pow(3, two) % 1000000007;
        answer += tmp;
        answer %= 1000000007;
        two -= 2;
        four++;
    }

    return answer;
}

int fac(int b)
{
    if(arr[b] != 0)
        return arr[b];

    int sum = 1;

    for(int i = 2; i <= b; i++)
    {
        sum *= i;
        arr[i] = sum;
    }

    return sum;
}
1 개의 답변
황규승

n = 6 // 41
n = 8 // 153
n = 5000 // 658712818
입니다.

8까지 맞게 나온다면 MOD가 문제가 있는거고 아니면 알고리즘 확인해 보세요.

  • 진성호
    제 알고리즘이 틀렸나 보네요 ㅠㅠ 답변 감사합니다! 진성호 2019.05.06 22:27
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.