Ensamblador


Enviar solució

Punts: 12 (parcial)
Temps Límit: 5.0s
Límit de memòria: 64M

Autor/a:
tipus del problema
Matrius
Categoria
Lliga de Programació FP
Llenguatges permesos
Bash, C#, C++, Haskell, Java, Kotlin, PHP, Python

ring

Bambino, en una demostració addicional de que no està bé ha decidit aprendre codi ensamblador modern. Aquest codi ensamblador, que m'he inventat totalment, és un llenguatge de programació simple utilitzat per realitzar càlculs senzills. Un programa manté un únic enter X en memòria, inicialment establert a zero, i realitza repetidament operacions d'addició, subtracció i multiplicació sobre ell.

Formalment, el llenguatge té sis tipus de sintaxi:

Sintaxi Descripció
ADD Y Suma Y a X
SUB Y Resta Y de X
MULT Y Multiplica X per Y
FUN F Comença la definició d'una funció amb el nom únic F
END Fi de la definició de funció actual
CALL F Crida la funció F

Les definicions de funcions poden estar niuades, en aquest cas END representa el final de la definició de funció més recent que no s'ha acabat encara. Per a les crides a funcions, la funció F ha d'haver estat definida en una línia anterior i una funció no pot cridar-se a si mateixa (en cas contrari, es produiria una recursió infinita).

Per exemple, el resultat del següent programa és 5:

Copy
FUN INCREMENT
ADD 1
END
CALL INCREMENT
MULT 2
ADD 3

Bambino ha escrit alguns programes en ensamblador, però troba que el seu linker triga una eternitat a executar-los. Pots ajudar a Bambino a determinar els resultats dels seus programes?

Entrada

La primera línia comença amb un únic enter T (1 ≤ T ≤ 10), el nombre de casos de prova. Segueixen T casos de prova.

Cada cas de prova comença amb un enter N (1 ≤ N ≤ 100000), el nombre d'instruccions en el programa. Les següents N línies contenen cadascuna una instrucció en el format descrit anteriorment.

Tots els enters seran no negatius i menors o iguals a 10^9. Els noms de les funcions seran en majúscules i tindran com a màxim 10 lletres.

Per als tres primers casos, no hi ha definicions de funcions. Per als següents dos casos, hi ha com a màxim una declaració de funció.

Sortida

Per a cada cas de prova, imprimeix el resultat del programa, mòdul 1.000.000.007.

Nota: "X mòdul Y es defineix com el residu positiu de X dividit per Y."

Exemple d'Entrada

Copy
2
3
ADD 1
MULT 1000000000
ADD 7
6
FUN INCREMENT
ADD 1
END
CALL INCREMENT
MULT 2
ADD 3

Exemple de Sortida

Copy
0
5

Nota: m'he inventat el llenguatge però és bastant similar a NASM. Podeu mirar NASM si us interessen llenguatges assembly que poden cridar funcions


Comentaris

En aquests moments no hi ha comentaris.