0으로 나누기 검사기
시간 제한2초메모리 제한512 MB
변수 범위가 주어질 때, 8비트 역폴란드 표기식 평가에서 0으로 나누는 경우가 생기는지 판정한다.
문제
모리시타 씨는 곤란한 상황에 빠졌습니다. 아네하라 씨에게 프로그램을 하나 받았는데, 그 프로그램이 크래시를 일으키는 것입니다.
아네하라 씨가 써 준 프로그램은 역폴란드 표기법 식을 읽고 계산 결과를 출력하는 프로그램인데, 크래시 로그를 보면 0으로 나눈 것이 원인인 것 같습니다. 모리시타 씨가 잘못된 식을 입력한 탓일 수도 있고, 어쩌면 아네하라 씨가 쓴 프로그램에 버그가 있을 수도 있습니다.
아네하라 씨가 쓴 프로그램을 읽어 보려고 했지만, 아네하라 씨의 프로그램은 어셈블리라는 잘 모르는 말로 쓰여 있어서 보기만 해도 머리가 지끈지끈합니다.
그래서 모리시타 씨는 당신에게 식이 잘못되었는지 조사하는 프로그램을 써 달라고 부탁했습니다. 식이 잘못되었다는 것은, 그 식에 따라 계산하면 0으로 나누는 일이 생길 가능성이 있다는 뜻입니다.
참고로 아네하라 씨가 쓴 코드는 아주 오래된 컴퓨터에서 동작하는데, 사칙연산은 정수로 수행하고 결과는 8비트 부호 없는 정수로 저장됩니다. 예를 들어 255+1은 0이 되고, 3/2는 1이 됩니다.
아, 아네하라 씨에게는 비밀입니다.
(참고) 역폴란드 표기법으로 나타낸 식을 계산하는 의사 코드
s = 빈 스택
n = 식의 요소 수
for i in 1..n:
if 식의 i번째 요소가 정수:
s에 그 정수를 푸시한다
if 식의 i번째 요소가 변수:
s에 그 변수의 값을 푸시한다
if 식의 i번째 요소가 연산자:
s에서 값을 팝하고, b라고 한다
s에서 값을 팝하고, a라고 한다
if 연산자가 '+':
r = (a + b) % 256 으로 한다
if 연산자가 '-':
r = (a - b + 256) % 256 으로 한다
if 연산자가 '*':
r = (a * b) % 256 으로 한다
if 연산자가 '/':
r = (a / b) % 256 으로 한다
s에 r을 푸시한다
s에서 값을 팝하고, 식의 계산 결과로 한다
입력
m
name1 lb1 ub1
...
namem lbm ubm
n
e1 e2 ... en
0 ≤ m ≤ 1000 ≤ lbi ≤ ubi ≤ 2551 ≤ namei (1 ≤ i ≤ m) の 길이 ≤ 201 ≤ n ≤ 100m은 변수의 수이고,namei,lbi,ubi는 각각 변수 i의 이름, 하한, 상한을 나타냅니다.n은 식에 포함된 요소의 수를 나타내고,ei는 식의i번째 요소를 나타냅니다.- 각 변수는 식 안에 많아야 한 번 등장합니다.
출력
식이 잘못되었으면 error, 잘못되지 않았으면 correct를 한 줄로 출력하세요.