Skip to content

Commit a829cce

Browse files
authored
Update Readme.md
1 parent 928da5b commit a829cce

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

Design/1622.Fancy-Sequence/Readme.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
所以我们发现了一个规律,如果当前的化简算子是{mul,add}的时候,我们想要append一个新的数字nums[i]时,我们不直接append原始的数值,我们append一个虚拟的数值val用来“抵消”这对算子的影响,即使得```nums[i] = val*mul+add```。这样我们调用getIdx(i)的时候,仍然apply当前的化简算子{mul,add}得到```val*mul+add```,恰好就还原了真实的nums[i]。即使此后的{mul,add}可能会更新为{mul',add'},但是val只是抵消了i之前的运算符的效果,并不会影响i之后的运算的作用,所以当再次调用getIdx(i)的时候,就可以放心地将{mul',add'}用在val上然后输出答案。
1616

17-
接下来的一个关键问题,我们试图得到这个“抵消”后的val时,发现```nums[i] = val*mul+add```并不能保证得到一个整数的```val= (nums[i]-add) / mul```,如果存储的是小数的话,此后的误差会越来越大。另外一个问题是,add和mul也会随着时间的推移有可能非常大直至越界。而如果你的mul一旦做了%M的操作,那么上面val的计算就是错误的。怎么办呢?事实上,我们并不需要存一个真实的val,我们只要存一个与val关于M同余的值就行了,我们记做val'。因为val'与val(关于M)同余,那么```val'*mul+add```就会与```val*mul+add```同余,也就是和最终的答案同余。而题目要求输出的就是将答案对M取模的结果。
17+
接下来的一个关键问题,我们试图得到这个“抵消”后的val时,发现```nums[i] = val*mul+add```并不能保证得到一个整数的```val= (nums[i]-add) / mul```,如果存储的是小数的话,此后的误差会越来越大。另外一个更重要的问题是,mul会随着时间的推移有可能非常大直至越界。而如果为了避免mul越界而对其做了%M的操作的话,那么上面val的计算方法得到的结果就是错误的。```因为(a/b)%M != a / (b%M)```
18+
19+
怎么办呢?事实上,我们并不需要存一个真实的val,我们只要存一个与val关于M同余的值就行了,我们记做val'。因为val'与val(关于M)同余,那么```val'*mul+add```就会与```val*mul+add```同余,也就是和最终的答案同余。而题目要求输出的就只是将答案对M取模的结果。
1820

1921
想求```(nums[i]-add) / mul```关于M的同余,不能用“(nums[i]-add)关于M的同余”去除以“mul关于M的同余”,因为除法不满足 (a/b)%M = (a%M) / (b%M) 。正确的答案是 ```(nums[i]-add) * inv(mul)```。其中inv(mul)称之为mul的逆元。满足如下关系的a和b称之为逆元:
2022
```

0 commit comments

Comments
 (0)