XORequation

문제 정보

문제

태윤이는 \(0\) 또는 \(1\)로 이루어진 길이 \(N\)짜리의 수열 \(A\)를 가지고 있었다. 그러나 태윤이는 수열 \(A\)의 각 원소가 무엇인지 까먹어 버렸다. 다행히도, 태윤이는 수열에 관한 몇 가지 정보를 기억하고 있었다. 각 정보는 \(i,j,x\) 의 순서로 이루어져 있으며, \(A_i\) XOR \(A_{i+1}\) XOR ⋯ XOR \(A_j\) = \(x\)라는 식이 성립한다는 것을 의미한다. 태윤이는 이 정보들로부터 만들어 낼 수 있는 수열의 경우의 수가 몇 개인지 알고 싶어 졌다. 여러분이 태윤이를 도와서 가능한 \(A\)의 경우의 수를 세어주자. 단, 수가 너무 클 수 있으니 \(1,000,000,007\)로 나눈 나머지를 구해야 한다.

입력

첫 줄에 테스트 케이스의 수 \(T\)가 주어진다.
각 테스트 케이스의 첫 줄에 수열의 길이 \(N(1 \le N \le 300,000)\), 정보의 개수 \(M(0 \le M \le 100,000)\)이 주어지며, 두 번째 줄부터는 \(M\)개의 줄에 걸쳐서 정보를 나타내는 정수 3개 \(i, j, x (1 \le i \le j \le N, 0 \le x \le 1)\)이 순서대로 주어진다

출력

각 테스트 케이스 마다 가능한 수열의 경우의 수를 \(1,000,000,007\)로 나눈 나머지를 출력한다. 만약, 태윤이의 정보가 부정확 하다면 \(–1\)을 출력한다.

예제 입력

2
3 2
1 2 1
2 3 0
3 3
1 3 0
1 2 0
3 3 1

예제 출력

2
-1

노트

#####예제 설명
첫 번째 예제의 경우 (1, 0, 0)과 (0, 1, 1) 두 가지의 수열이 존재한다

#####참고 : XOR operation

XOR operation 의 진리표는 다음과 같다. C나 Java에서는 ^ 라는 operator를 사용하면 알맞은 결과를 얻을 수 있다.

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

0개의 댓글이 있습니다.