만드는 중입니다

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

도로 건설

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

요약
거리가 K 이하인 집들 사이에 정확히 M개의 양방향 도로를 놓되 모든 집의 차수가 짝수가 되도록 하는 경우의 수를 1,000,000,007로 나눈 나머지로 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 그래프, 비트 연산
정답자
아직 제출이 없습니다

문제

영선이가 사는 도시에는 집이 NN개 있고, 1번부터 NN번까지 번호가 붙어 있다. 지금 이 도시에는 도로가 하나도 없다. 영선이는 아래 두 조건을 지키면서 집과 집을 잇는 양방향 도로를 정확히 MM개 만들려고 한다.

  • 서로 다른 두 집 AA와 BB는 0<∣A−B∣≤K0 < |A - B| \le K일 때만 도로로 이을 수 있다. 도로로 이어진 두 집은 서로 인접하다고 한다. 같은 집의 쌍을 잇는 도로를 여러 개 만들 수 있다.
  • 모든 집은 짝수 개의 도로와 인접해야 한다.

어떤 집의 쌍을 잇는 도로의 개수가 서로 다르면 두 방법을 다른 방법으로 센다. NN, MM, KK가 주어졌을 때 도로를 만드는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 NN, MM, KK가 주어진다. (1≤N≤301 \le N \le 30, 0≤M≤300 \le M \le 30, 1≤K≤81 \le K \le 8)

출력

첫째 줄에 도로를 만드는 방법의 수를 1,000,000,007로 나눈 나머지를 출력한다.

힌트

첫 번째 예제에서는 아래와 같이 도로를 건설할 수 있다.

두 번째 예제에서는 아래와 같이 도로를 건설할 수 있다.

예제5

  1. 예제 1

    입력
    3 4 1
    
    예상 출력
    3
    
  2. 예제 2

    입력
    4 3 3
    
    예상 출력
    4
    
  3. 예제 3

    입력
    2 1 1
    
    예상 출력
    0
    
  4. 예제 4

    입력
    5 0 3
    
    예상 출력
    1
    
  5. 예제 5

    입력
    10 20 5
    
    예상 출력
    26964424