from decimal import *
getcontext().prec = 1000 # 设置精度为1000位小数
# 输入n和m
n, m = list(map(eval, input().split()))
# 输入表达式字符串
f_str = input()
items = f_str.split() # 将表达式字符串按空格拆分为列表
st = [] # 初始化一个空栈
opts = {'+', '-', '*', '/'} # 运算符集合
i = 0
while i < len(items):
e = items[i]
i += 1
if e not in opts: # 如果当前元素不是运算符
st.append(e) # 将其压入栈中
else:
e1 = st.pop() # 弹出栈顶元素作为第一个操作数
e2 = st.pop() # 再弹出栈顶元素作为第二个操作数
# 判断操作数是否为数字或以正负号开头的字符串,如果是则构造 Decimal 类型的字符串
if e1[0].isdigit() or e1[0] in ['+', '-']:
e1 = f"Decimal('{e1}')"
if e2[0].isdigit() or e2[0] in ['+', '-']:
e2 = f"Decimal('{e2}')"
r = f'({e2}{e}{e1})' # 构造运算表达式
st.append(r) # 将结果压入栈中
f = st[0] # 获取最终的运算表达式
# 1e-901 当做我们的delta
delta = Decimal('0.' + '0' * 900 + '1') # 定义一个极小的增量
mod = Decimal('1000000007') # 模值
for x in range(m):
line = input().split() # 获取输入的一行数据并按空格分割
i = eval(line[0]) # 第一个元素是索引值,将其转换为整数
for y in range(1, len(line)):
value = eval(line[y]) # 将每个元素转换为相应的数值
exec(f'x{y}=Decimal({line[y]})') # 为每个变量赋值为对应的 Decimal 类型的值
y1 = eval(f) # 计算运算表达式的值
value = Decimal(line[i]) - delta # 获取索引对应的值并减去一个极小的增量
exec(f'x{i}=Decimal(line[i]) - delta') # 对索引对应的值赋值为减去增量后的值
y2 = eval(f) # 重新计算运算表达式的值
ans = (y1 - y2) / delta # 计算差值并除以增量
# 下面循环最多执行2次,复杂度是O(1)
while not Decimal('0') <= ans < mod: # 对结果进行取模操作,使其在 [0, mod) 范围内
if ans < Decimal('0'):
ans = ans % mod + mod # 手动调整到 [0, mod) 区间
else:
ans = ans % mod
print(round(ans, 0)) # 输出结果取整后的值
ZnJvbSBkZWNpbWFsIGltcG9ydCAqCiAKZ2V0Y29udGV4dCgpLnByZWMgPSAxMDAwICAjIOiuvue9rueyvuW6puS4ujEwMDDkvY3lsI/mlbAKIAojIOi+k+WFpW7lkoxtCm4sIG0gPSBsaXN0KG1hcChldmFsLCBpbnB1dCgpLnNwbGl0KCkpKQogCiMg6L6T5YWl6KGo6L6+5byP5a2X56ym5LiyCmZfc3RyID0gaW5wdXQoKQppdGVtcyA9IGZfc3RyLnNwbGl0KCkgICMg5bCG6KGo6L6+5byP5a2X56ym5Liy5oyJ56m65qC85ouG5YiG5Li65YiX6KGoCiAKc3QgPSBbXSAgIyDliJ3lp4vljJbkuIDkuKrnqbrmoIgKb3B0cyA9IHsnKycsICctJywgJyonLCAnLyd9ICAjIOi/kOeul+espumbhuWQiAogCmkgPSAwCndoaWxlIGkgPCBsZW4oaXRlbXMpOgogICAgZSA9IGl0ZW1zW2ldCiAgICBpICs9IDEKICAgIGlmIGUgbm90IGluIG9wdHM6ICAjIOWmguaenOW9k+WJjeWFg+e0oOS4jeaYr+i/kOeul+espgogICAgICAgIHN0LmFwcGVuZChlKSAgIyDlsIblhbbljovlhaXmoIjkuK0KICAgIGVsc2U6CiAgICAgICAgZTEgPSBzdC5wb3AoKSAgIyDlvLnlh7rmoIjpobblhYPntKDkvZzkuLrnrKzkuIDkuKrmk43kvZzmlbAKICAgICAgICBlMiA9IHN0LnBvcCgpICAjIOWGjeW8ueWHuuagiOmhtuWFg+e0oOS9nOS4uuesrOS6jOS4quaTjeS9nOaVsAogICAgICAgICMg5Yik5pat5pON5L2c5pWw5piv5ZCm5Li65pWw5a2X5oiW5Lul5q2j6LSf5Y+35byA5aS055qE5a2X56ym5Liy77yM5aaC5p6c5piv5YiZ5p6E6YCgIERlY2ltYWwg57G75Z6L55qE5a2X56ym5LiyCiAgICAgICAgaWYgZTFbMF0uaXNkaWdpdCgpIG9yIGUxWzBdIGluIFsnKycsICctJ106CiAgICAgICAgICAgIGUxID0gZiJEZWNpbWFsKCd7ZTF9JykiCiAgICAgICAgaWYgZTJbMF0uaXNkaWdpdCgpIG9yIGUyWzBdIGluIFsnKycsICctJ106CiAgICAgICAgICAgIGUyID0gZiJEZWNpbWFsKCd7ZTJ9JykiCiAgICAgICAgciA9IGYnKHtlMn17ZX17ZTF9KScgICMg5p6E6YCg6L+Q566X6KGo6L6+5byPCiAgICAgICAgc3QuYXBwZW5kKHIpICAjIOWwhue7k+aenOWOi+WFpeagiOS4rQogCmYgPSBzdFswXSAgIyDojrflj5bmnIDnu4jnmoTov5Dnrpfooajovr7lvI8KIAogCiMgMWUtOTAxIOW9k+WBmuaIkeS7rOeahGRlbHRhCmRlbHRhID0gRGVjaW1hbCgnMC4nICsgJzAnICogOTAwICsgJzEnKSAgIyDlrprkuYnkuIDkuKrmnoHlsI/nmoTlop7ph48KbW9kID0gRGVjaW1hbCgnMTAwMDAwMDAwNycpICAjIOaooeWAvAogCmZvciB4IGluIHJhbmdlKG0pOgogICAgbGluZSA9IGlucHV0KCkuc3BsaXQoKSAgIyDojrflj5bovpPlhaXnmoTkuIDooYzmlbDmja7lubbmjInnqbrmoLzliIblibIKICAgIGkgPSBldmFsKGxpbmVbMF0pICAjIOesrOS4gOS4quWFg+e0oOaYr+e0ouW8leWAvO+8jOWwhuWFtui9rOaNouS4uuaVtOaVsAogICAgZm9yIHkgaW4gcmFuZ2UoMSwgbGVuKGxpbmUpKToKICAgICAgICB2YWx1ZSA9IGV2YWwobGluZVt5XSkgICMg5bCG5q+P5Liq5YWD57Sg6L2s5o2i5Li655u45bqU55qE5pWw5YC8CiAgICAgICAgZXhlYyhmJ3h7eX09RGVjaW1hbCh7bGluZVt5XX0pJykgICMg5Li65q+P5Liq5Y+Y6YeP6LWL5YC85Li65a+55bqU55qEIERlY2ltYWwg57G75Z6L55qE5YC8CiAgICB5MSA9IGV2YWwoZikgICMg6K6h566X6L+Q566X6KGo6L6+5byP55qE5YC8CiAgICB2YWx1ZSA9IERlY2ltYWwobGluZVtpXSkgLSBkZWx0YSAgIyDojrflj5bntKLlvJXlr7nlupTnmoTlgLzlubblh4/ljrvkuIDkuKrmnoHlsI/nmoTlop7ph48KICAgIGV4ZWMoZid4e2l9PURlY2ltYWwobGluZVtpXSkgLSBkZWx0YScpICAjIOWvuee0ouW8leWvueW6lOeahOWAvOi1i+WAvOS4uuWHj+WOu+WinumHj+WQjueahOWAvAogICAgeTIgPSBldmFsKGYpICAjIOmHjeaWsOiuoeeul+i/kOeul+ihqOi+vuW8j+eahOWAvAogICAgYW5zID0gKHkxIC0geTIpIC8gZGVsdGEgICMg6K6h566X5beu5YC85bm26Zmk5Lul5aKe6YePCiAgICAjIOS4i+mdouW+queOr+acgOWkmuaJp+ihjDLmrKHvvIzlpI3mnYLluqbmmK9PKDEpCiAgICB3aGlsZSBub3QgRGVjaW1hbCgnMCcpIDw9IGFucyA8IG1vZDogICMg5a+557uT5p6c6L+b6KGM5Y+W5qih5pON5L2c77yM5L2/5YW25ZyoIFswLCBtb2QpIOiMg+WbtOWGhQogICAgICAgIGlmIGFucyA8IERlY2ltYWwoJzAnKToKICAgICAgICAgICAgYW5zID0gYW5zICUgbW9kICsgbW9kICAjIOaJi+WKqOiwg+aVtOWIsCBbMCwgbW9kKSDljLrpl7QKICAgICAgICBlbHNlOgogICAgICAgICAgICBhbnMgPSBhbnMgJSBtb2QKICAgIHByaW50KHJvdW5kKGFucywgMCkpICAjIOi+k+WHuue7k+aenOWPluaVtOWQjueahOWAvA==
NjAgMQp4MSB4MiArIHgzIHg0ICsgKiB4NSB4NiArICogeDcgeDggKyAqIHg5IHgxMCArICogeDExIHgxMiArICogeDEzIHgxNCArICogeDE1IHgxNiArICogeDE3IHgxOCArICogeDE5IHgyMCArICogeDIxIHgyMiArICogeDIzIHgyNCArICogeDI1IHgyNiArICogeDI3IHgyOCArICogeDI5IHgzMCArICogeDMxIHgzMiArICogeDMzIHgzNCArICogeDM1IHgzNiArICogeDM3IHgzOCArICogeDM5IHg0MCArICogeDQxIHg0MiArICogeDQzIHg0NCArICogeDQ1IHg0NiArICogeDQ3IHg0OCArICogeDQ5IHg1MCArICogeDUxIHg1MiArICogeDUzIHg1NCArICogeDU1IHg1NiArICogeDU3IHg1OCArICogeDU5IHg2MCArICogCjEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAK
60 1
x1 x2 + x3 x4 + * x5 x6 + * x7 x8 + * x9 x10 + * x11 x12 + * x13 x14 + * x15 x16 + * x17 x18 + * x19 x20 + * x21 x22 + * x23 x24 + * x25 x26 + * x27 x28 + * x29 x30 + * x31 x32 + * x33 x34 + * x35 x36 + * x37 x38 + * x39 x40 + * x41 x42 + * x43 x44 + * x45 x46 + * x47 x48 + * x49 x50 + * x51 x52 + * x53 x54 + * x55 x56 + * x57 x58 + * x59 x60 + *
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0