아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

배열 초기화

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

요약
길이 N인 배열의 모든 자리를 덮도록 구간 mark 연산 M개를 순서대로 나열하는 경우의 수를 10^9+7로 나눈 나머지로 구한다.
난이도

보통10점 중 7점

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

문제

여러 프로그래밍 언어에는 배열 전체나 일부를 특정 값으로 채우는 함수가 있다. Pascal에서는 fillchar(), Java에서는 Arrays.fill(), C++에서는 memset()이다. 새 프로그래밍 언어 J#에는 논리형 배열에만 쓸 수 있는 mark() 함수가 있다.

두 매개변수 aa와 bb로 호출한 mark 함수는 인덱스 aa부터 bb까지의 모든 배열 원소에 true를 대입한다. 예를 들어 1부터 번호가 매겨지고 처음에 모든 값이 false인 길이 4의 배열에 mark(1, 3)과 mark(2, 4)를 실행하면 배열 전체가 true로 채워진다.

J#를 배우기 시작한 사람들의 첫 과제 중 하나는 정확히 MM번의 mark 연산을 포함하고, 처음에 false로 채워진 길이 NN의 배열을 true로 완전히 채우는 프로그램을 작성하는 것이다.

이 과제를 빠르게 해결한 당신은 이제 생각한다. 이 일을 하는 서로 다른 방법은 몇 가지일까? 두 프로그램에서 1부터 MM까지의 어떤 ii에 대해 ii번째 mark 연산이 서로 다른 매개변수로 실행되면 서로 다른 방법으로 본다. 이 수는 클 수 있으므로 109+710^9+7로 나눈 나머지를 구해야 한다.

입력

첫째 줄에 두 자연수 NN과 MM이 주어진다. 이는 배열의 길이와 프로그램에 있어야 하는 mark 연산의 수이다. (1≤N,M≤701 \le N, M \le 70)

출력

NN개의 원소로 이루어진 배열을 MM번의 mark 연산으로 true로 채우는 방법의 수를 109+710^9+7로 나눈 나머지를 한 줄에 출력한다.

힌트

구하는 경우:

  • mark(1, 1); mark(1, 2)
  • mark(1, 1); mark(2, 2)
  • mark(1, 2); mark(1, 1)
  • mark(1, 2); mark(1, 2)
  • mark(1, 2); mark(2, 2)
  • mark(2, 2); mark(1, 1)
  • mark(2, 2); mark(1, 2)

예제1

  1. 예제 1

    입력
    2 2
    
    예상 출력
    7