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

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

K-균등 문자열

시간 제한1초메모리 제한256 MB

요약
길이 N인 0과 1 문자열 중, 주어진 M개 구간 각각에서 길이 K인 모든 연속 부분 문자열이 같은 개수의 1을 갖는 문자열의 수를 1,000,000,007로 나눈 나머지로 구한다.
난이도

어려움10점 중 8점

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

문제

0과 1로 이루어진 문자열에서 길이가 KK인 연속 부분문자열을 모두 살펴봤을 때 그 안에 들어 있는 1의 개수가 전부 같으면, 이 문자열을 KK-균등하다고 하자.

예를 들어 문자열 100110은 4-균등하다. 길이가 4인 연속 부분문자열은 1001, 0011, 0110 세 개인데 셋 다 1을 두 개씩 담고 있기 때문이다.

온조는 0과 1로 이루어진 길이 NN의 문자열을 만들려고 한다. 온조에게는 좋아하는 구간 MM개와 좋아하는 수 MM개가 있다. ii번째 구간은 LiL_i번째 문자부터 RiR_i번째 문자까지의 부분문자열을 뜻하고, ii번째 수는 KiK_i이다. 온조는 ii번째 구간에 해당하는 부분문자열이 KiK_i-균등하기를 원한다. KiK_i는 ii번째 구간의 길이보다 크지 않다.

온조가 만들 수 있는 문자열의 개수를 구하여라. 수가 커질 수 있으니 1,000,000,007로 나눈 나머지를 출력한다.

입력

첫째 줄에 NN과 MM이 주어진다. (1≤N≤10001 \le N \le 1000, 0≤M≤10000 \le M \le 1000)

이어지는 MM개 줄 중 ii번째 줄에 LiL_i, RiR_i, KiK_i가 주어진다. (1≤Li≤Ri≤N1 \le L_i \le R_i \le N, 1≤Ki≤Ri−Li+11 \le K_i \le R_i - L_i + 1)

출력

첫째 줄에 온조가 만들 수 있는 문자열의 개수를 1,000,000,007로 나눈 나머지를 출력한다.

힌트

첫 번째 예제에서 만들 수 있는 문자열은 00000, 00001, 01010, 01011, 10100, 10101, 11110, 11111의 여덟 가지이다.

두 번째 예제에는 온조가 좋아하는 구간도 수도 없으므로 길이 NN의 문자열을 아무렇게나 만들어도 된다. 즉 210002^{1000}가지를 만들 수 있다.

예제2

  1. 예제 1

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

    입력
    1000 0
    
    예상 출력
    688423210