#1835. 浮点数精度

浮点数精度

题目描述

楠枫学习编程的过程中遇到了一个大麻烦,他发现作为人类智慧的结晶 —— 计算机,竟然无法正确的计算加法,他觉得很不可思议!比如 0.1+0.2=0.30.1 + 0.2 = 0.3 是正确的,可是当他编程时程序的判断却是错误的。他的代码大致如下。

后来老师告诉他,这是因为计算机用二进制存储数据,有可能无法精确地表示某些十进制小数,所以两者判等时出错。

既然知道了原因,楠枫打算找一找这种在计算上本该相等,却在程序判等时不一致的数。他的寻找方法如下:

对于含有 mm 位小数的数字 dd (数字 dd 除最后一位数位不为 00 外,其余都为 00 ,如含有 66 位的小数 0.0000030.000003),按如下步骤操作:

  1. 通过 d×10md \times 10^m 获得的数字 dd 非零位上的数字 ss
  2. ss 扩大 kk 倍后再除以 10m10^m ,以获得与 ddkk 倍对应的浮点数 v(v=sk10m)v(v=\frac{sk}{10^m})
  3. 通过程序将 kkdd 加起来的和与 vv 直接进行判等。

其中,kk 是一个正整数,为了获得更多数据,楠枫会把 kk11 枚举到 n(1kn)n(1 \le k \le n) ,也就是他会按上述步骤判等 nn 次,依次检查 dd11 倍、 22 倍、 33 倍 ...... nn 倍。如果发现判等结果不成立,将会按要求打印一个不等式,格式为:

$ \underbrace{d + d + \cdots + d}_{k \text{个} d} \neq v $

输入格式

第一行两个整数,表示最大的倍数 nn 和小数位数 mm

第二行一个小数,代表要检查的小数 dd

输出格式

如果有判等结果不成立,就输出一行不等式(ddvv 要保留 mm 位小数);如果所有的判等结果都成立,输出内容为空。

样例

10 1
0.1
0.1 + 0.1 + 0.1 != 0.3
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 != 0.8
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 != 0.9
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 != 1.0
10 3
0.001
0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 != 0.009
0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 + 0.001 != 0.010

样例解释

对于样例, n=10,m=1,d=0.1n=10,m=1,d=0.1 ,当 kk 分别等于 3,8,9,103,8,9,10 时,判等结果不成立,因此会输出 44 行不等式。

数据范围

5n20,1m105 \le n \le 20, 1 \le m \le 10