fork download
  1. from decimal import *
  2.  
  3. getcontext().prec = 1000 # 设置精度为1000位小数
  4.  
  5. # 输入n和m
  6. n, m = list(map(eval, input().split()))
  7.  
  8. # 输入表达式字符串
  9. f_str = input()
  10. items = f_str.split() # 将表达式字符串按空格拆分为列表
  11.  
  12. st = [] # 初始化一个空栈
  13. opts = {'+', '-', '*', '/'} # 运算符集合
  14.  
  15. i = 0
  16. while i < len(items):
  17. e = items[i]
  18. i += 1
  19. if e not in opts: # 如果当前元素不是运算符
  20. st.append(e) # 将其压入栈中
  21. else:
  22. e1 = st.pop() # 弹出栈顶元素作为第一个操作数
  23. e2 = st.pop() # 再弹出栈顶元素作为第二个操作数
  24. # 判断操作数是否为数字或以正负号开头的字符串,如果是则构造 Decimal 类型的字符串
  25. if e1[0].isdigit() or e1[0] in ['+', '-']:
  26. e1 = f"Decimal('{e1}')"
  27. if e2[0].isdigit() or e2[0] in ['+', '-']:
  28. e2 = f"Decimal('{e2}')"
  29. r = f'({e2}{e}{e1})' # 构造运算表达式
  30. st.append(r) # 将结果压入栈中
  31.  
  32. f = st[0] # 获取最终的运算表达式
  33.  
  34.  
  35. # 1e-901 当做我们的delta
  36. delta = Decimal('0.' + '0' * 900 + '1') # 定义一个极小的增量
  37. mod = Decimal('1000000007') # 模值
  38.  
  39. for x in range(m):
  40. line = input().split() # 获取输入的一行数据并按空格分割
  41. i = eval(line[0]) # 第一个元素是索引值,将其转换为整数
  42. for y in range(1, len(line)):
  43. value = eval(line[y]) # 将每个元素转换为相应的数值
  44. exec(f'x{y}=Decimal({line[y]})') # 为每个变量赋值为对应的 Decimal 类型的值
  45. y1 = eval(f) # 计算运算表达式的值
  46. value = Decimal(line[i]) - delta # 获取索引对应的值并减去一个极小的增量
  47. exec(f'x{i}=Decimal(line[i]) - delta') # 对索引对应的值赋值为减去增量后的值
  48. y2 = eval(f) # 重新计算运算表达式的值
  49. ans = (y1 - y2) / delta # 计算差值并除以增量
  50. # 下面循环最多执行2次,复杂度是O(1)
  51. while not Decimal('0') <= ans < mod: # 对结果进行取模操作,使其在 [0, mod) 范围内
  52. if ans < Decimal('0'):
  53. ans = ans % mod + mod # 手动调整到 [0, mod) 区间
  54. else:
  55. ans = ans % mod
  56. print(round(ans, 0)) # 输出结果取整后的值
Success #stdin #stdout 0.04s 10612KB
stdin
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
stdout
0