理解
根据前面的整除的理解,我们类比一下得到a%b=c: 一直用长度为b的刀去砍a,最后剩余的不中b部分的长度为c,显然0⩽c<b
c++中的取余
c++与python都有取余运算,但是有区别
有两个数a,b,求a%b的值,如果a,b>0,那么c++与python的结果是一样的.但如果a⩾0,b<0,那么结果就不一样了
a = 10
b = -7
print(a % b)
int a = 10;
int b = -7;
cout << a % b << endl;
为什么c++与python的结果不一样呢?怎么从数学的角度解释呢? TODO 后面有时间写
如果使c++得到与 python的结果一样呢?
int python_mod(int a,int b) {
int c = b <0 ? -b:b;
return (( a % b) +c) %c;
}
取余运算的规律
1. 和的模等于模的和
(a+b)modq=(amodq+bmodq)modq证明:
(a+b)modq 的结果可以理解成长为a与长为b的木条拼接在一起得到长为a+b的木条,然后用q除得到的不足q的部分的长度.相当于,先用长度为a的木条除q得到不足q的部分a1,(amodq),然后用长度为b的木条除q得到不足q的部分b1,(bmodq),然后用a1+b1拼成一个木条用q除,得到剩余的部分,(a1+b1)modq.显然这两种方法得到的结果是一样的.
(a1+a2+⋯+an)modq=((((a1modq)+a2)modq+a3)modq+⋯+an)modq结论:显然全部加起来最后取模与边取模边加得到的结果是一样的.
2. 积的模等于模的积
(a×b)modq=((amodq)×(bmodq))modq证明:
(a×b)modq=((amodq)×b)modq(1)所以根据(1)和乘法交换律得到
((amodq)×b)modq=(b×(amodq))modq=((bmodq)×(amodq))modq=((amodq)×(bmodq))modq(2)(3)(4)
结论:显然全部乘起来最后取模与边取模边乘得到的结果是一样的.
带余除法
一般地,设a,b为整数,且b=0,则存在惟一的一对整数q和r,使得
a=b⋅q+r,0⩽r<∣b∣.转圈与取余的关系
如下图Figure 1所示:有8个数:0,1,2,⋯,7围成一个圈,问:
- 顺时针(clockwise),从0开始走1步是停下来是哪个位置?
- 顺时针(clockwise),从0开始走4步是停下来是哪个位置?
- 顺时针(clockwise),从0开始走100步是停下来是哪个位置?
- 顺时针(clockwise),从0开始走x步是停下来是哪个位置?
- 顺时针(clockwise),从7开始走1步是停下来是哪个位置?
- 顺时针(clockwise),从7开始走2步是停下来是哪个位置?
- 顺时针(clockwise),从7开始走110步是停下来是哪个位置?
- 顺时针(clockwise),从p(0⩽p⩽7)开始走x步是停下来是哪个位置?
- 逆时针(Counterclockwise),从0开始走1步是停下来是哪个位置?
- 逆时针(Counterclockwise),从0开始走4步是停下来是哪个位置?
- 逆时针(Counterclockwise),从0开始走100步是停下来是哪个位置?
- 逆时针(Counterclockwise),从0开始走x步是停下来是哪个位置?
- 逆时针(Counterclockwise),从p(0⩽p⩽7)开始走x步是停下来是哪个位置?

显然有一个很容易想到的规律1:从任意一个位置x开始走,如果恰好走了一圈(8步),停下的位置就是x.
- ⇒走n(n⩾0)圈,相当于没有走
- ⇒,设一图长度(数字数量)为l,走n⋅l 步,相当于没有走,相当于,走了0步
- ⇒走n⋅l+1 步,相当于走了1步
那么逆着走呢?
可以发现如下的规律,从某个位置逆着走1步,所到达的位置与正着走7步所到达的位置是一样的
所以: 从任意位置p逆着走x(0⩽x<8步,所到达的位置与正着走8−x步所到达的位置是一样的
由此可以得到:
- 顺时针(clockwise),从0开始走1步是停下来是哪个位置?
- 顺时针(clockwise),从0开始走4步是停下来是哪个位置?
- 顺时针(clockwise),从0开始走100步是停下来是哪个位置?
- 0+100%8=5,到达位置5
- 顺时针(clockwise),从0开始走x步是停下来是哪个位置?
- 0+x%8,到达位置x%8
- 顺时针(clockwise),从7开始走1步是停下来是哪个位置?
- 7+1%8=8,到达位置8, 但是没有位置8,可知位置8对应的就是位置0,8%8=0
- 顺时针(clockwise),从7开始走2步是停下来是哪个位置?
- (7+2%8)%8=1,到达位置1
- 顺时针(clockwise),从7开始走110步是停下来是哪个位置?
- (7+110%8)%8=5,到达位置5
- 顺时针(clockwise),从p(0⩽p⩽7)开始走x步是停下来是哪个位置?
- (p+x%8)%8,到达位置(p+x%8)%8
- 逆时针(Counterclockwise),从0开始走1步是停下来是哪个位置?
- 逆走1步,相当于正走7步,到达7
- 逆着走1,可以认为走了−1步,
-1%8=7
- 逆时针(Counterclockwise),从0开始走4步是停下来是哪个位置?
- 逆走4步,相当于正走4步,到达4
- 逆着走4,可以认为走了−4步,
-4%8=4
- 逆时针(Counterclockwise),从0开始走100步是停下来是哪个位置?
- 逆着走100,可以认为走了−100步,
-100%8=4
- 到达位置4
- 逆时针(Counterclockwise),从0开始走x步是停下来是哪个位置?
- 逆时针(Counterclockwise),从p(0⩽p⩽7)开始走x步是停下来是哪个位置?
- (p−(x%8))%8
总结
在一个由n个数字组成的圈中
规律1: 从任意一个位置x顺时针走y步,停下的位置为(x+y%n)%n
规律2: 从任意一个位置x逆时针走y步,停下的位置为(x+(n−y%n))%n=(x+n−y%n)%n
问题
注意下面图Figure 2,3,并不是从0开始的,
问
Figure 1,从起点1开始正走123步,是哪里?
Figure 2,从起点2开始正走124步,是哪里?
Figure 1,从3开始逆走132步,是哪里?
Figure 2,从5开始逆走124步,是哪里?


相关题目
- roj 2595 NOIP2012-普及 寻宝
- CSP-S 2023 密码锁
- 约瑟夫问题
- luogu P1996 约瑟夫问题