理解

根据前面的整除的理解,我们类比一下得到a%b=ca \% b = c: 一直用长度为bb的刀去砍aa,最后剩余的不中bb部分的长度为cc,显然0c<b0 \leqslant c < b

c++中的取余

c++python都有取余运算,但是有区别

有两个数a,ba,b,求a%ba \% b的值,如果a,b>0a , b > 0,那么c++python的结果是一样的.但如果a0,b<0a \geqslant 0,b <0,那么结果就不一样了

a = 10
b = -7
print(a % b)
int a = 10;
int b = -7;
cout << a % b << endl; // -3

为什么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) \mod q = (a \mod q + b \mod q) \mod q

证明:

(a+b)modq(a+b) \mod q 的结果可以理解成长为aa与长为bb的木条拼接在一起得到长为a+ba+b的木条,然后用qq除得到的不足qq的部分的长度.相当于,先用长度为aa的木条除qq得到不足qq的部分a1a_1,(amodqa \mod q),然后用长度为bb的木条除qq得到不足qq的部分b1b_1,(bmodqb \mod q),然后用a1+b1a_1+b_1拼成一个木条用qq除,得到剩余的部分,(a1+b1)modq(a_1+b_1) \mod q.显然这两种方法得到的结果是一样的.

(a1+a2++an)modq=((((a1modq)+a2)modq+a3)modq++an)modq (a_1+ a_2+\cdots + a_n) \mod q = ((( (a_1 \mod q) + a_2 ) \mod q + a_3 )\mod q + \cdots +a_n )\mod q

结论:显然全部加起来最后取模与边取模边加得到的结果是一样的.

2. 积的模等于模的积

(a×b)modq=((amodq)×(bmodq))modq (a \times b) \mod q = ( (a \mod q) \times (b \mod q)) \mod q

证明:

(a×b)modq=((amodq)×b)modq(1) (a \times b) \mod q = ( (a \mod q) \times b) \mod q \tag{1}

所以根据(1)(1)和乘法交换律得到

((amodq)×b)modq=(b×(amodq))modq=((bmodq)×(amodq))modq=((amodq)×(bmodq))modq \begin{align} ( (a \mod q) \times b) \mod q &= ( b \times (a \mod q)) \mod q \tag 2 \\ &= ( (b \mod q) \times (a \mod q)) \mod q \tag 3 \\ &=( (a \mod q) \times (b \mod q) ) \mod q \tag 4 \end{align}

结论:显然全部乘起来最后取模与边取模边乘得到的结果是一样的.

带余除法

一般地,设a,ba,b为整数,且b0b \ne 0,则存在惟一的一对整数qqrr,使得

a=bq+r,0r<b. a = b \cdot q + r , 0 \leqslant r < |b|.

转圈与取余的关系

如下图Figure 1所示:有88个数:0,1,2,,70,1,2,\cdots,7围成一个圈,问:

  1. 顺时针(clockwiseclockwise),从00开始走11步是停下来是哪个位置?
  2. 顺时针(clockwiseclockwise),从00开始走44步是停下来是哪个位置?
  3. 顺时针(clockwiseclockwise),从00开始走100100步是停下来是哪个位置?
  4. 顺时针(clockwiseclockwise),从00开始走xx步是停下来是哪个位置?
  5. 顺时针(clockwiseclockwise),从77开始走11步是停下来是哪个位置?
  6. 顺时针(clockwiseclockwise),从77开始走22步是停下来是哪个位置?
  7. 顺时针(clockwiseclockwise),从77开始走110110步是停下来是哪个位置?
  8. 顺时针(clockwiseclockwise),从p(0p7)p(0 \leqslant p \leqslant 7)开始走xx步是停下来是哪个位置?
  9. 逆时针(CounterclockwiseCounterclockwise),从00开始走11步是停下来是哪个位置?
  10. 逆时针(CounterclockwiseCounterclockwise),从00开始走44步是停下来是哪个位置?
  11. 逆时针(CounterclockwiseCounterclockwise),从00开始走100100步是停下来是哪个位置?
  12. 逆时针(CounterclockwiseCounterclockwise),从00开始走xx步是停下来是哪个位置?
  13. 逆时针(CounterclockwiseCounterclockwise),从p(0p7)p(0 \leqslant p \leqslant 7)开始走xx步是停下来是哪个位置?

circle1

显然有一个很容易想到的规律1:从任意一个位置xx开始走,如果恰好走了一圈(88步),停下的位置就是xx.

  • \Rightarrown(n0)n(n \geqslant 0)圈,相当于没有走
  • \Rightarrow,设一图长度(数字数量)为ll,走nln \cdot l 步,相当于没有走,相当于,走了00
  • \Rightarrownl+1n \cdot l +1 步,相当于走了11

那么逆着走呢?

可以发现如下的规律,从某个位置逆着走11步,所到达的位置与正着走77步所到达的位置是一样的

所以: 从任意位置pp逆着走x(0x<8x(0 \leqslant x <8步,所到达的位置与正着走8x8-x步所到达的位置是一样的

由此可以得到:

  1. 顺时针(clockwiseclockwise),从00开始走11步是停下来是哪个位置?
    • 0+1=10+1=1,到达位置11
  2. 顺时针(clockwiseclockwise),从00开始走44步是停下来是哪个位置?
    • 0+4=40+4=4,到达位置44
  3. 顺时针(clockwiseclockwise),从00开始走100100步是停下来是哪个位置?
    • 0+100%8=50+100 \% 8=5,到达位置55
  4. 顺时针(clockwiseclockwise),从00开始走xx步是停下来是哪个位置?
    • 0+x%80+x\%8,到达位置x%8x \% 8
  5. 顺时针(clockwiseclockwise),从77开始走11步是停下来是哪个位置?
    • 7+1%8=87+1\%8 = 8,到达位置88, 但是没有位置88,可知位置88对应的就是位置00,8%8=08 \% 8 = 0
  6. 顺时针(clockwiseclockwise),从77开始走22步是停下来是哪个位置?
    • (7+2%8)%8=1(7+2\%8)\%8 = 1,到达位置11
  7. 顺时针(clockwiseclockwise),从77开始走110110步是停下来是哪个位置?
    • (7+110%8)%8=5(7+110\%8)\%8 = 5,到达位置55
  8. 顺时针(clockwiseclockwise),从p(0p7)p(0 \leqslant p \leqslant 7)开始走xx步是停下来是哪个位置?
    • (p+x%8)%8(p+x\%8)\%8,到达位置(p+x%8)%8(p+x \% 8)\%8
  9. 逆时针(CounterclockwiseCounterclockwise),从00开始走11步是停下来是哪个位置?
    • 逆走11步,相当于正走77步,到达77
    • 逆着走1,可以认为走了1-1步,-1%8=7
  10. 逆时针(CounterclockwiseCounterclockwise),从00开始走44步是停下来是哪个位置?
    • 逆走44步,相当于正走44步,到达44
    • 逆着走44,可以认为走了4-4步,-4%8=4
  11. 逆时针(CounterclockwiseCounterclockwise),从00开始走100100步是停下来是哪个位置?
    • 逆着走100100,可以认为走了100-100步,-100%8=4
    • 到达位置44
  12. 逆时针(CounterclockwiseCounterclockwise),从00开始走xx步是停下来是哪个位置?
    • x%8-x \% 8
  13. 逆时针(CounterclockwiseCounterclockwise),从p(0p7)p(0 \leqslant p \leqslant 7)开始走xx步是停下来是哪个位置?
    • (p(x%8))%8(p - (x \% 8))\%8

总结

在一个由nn个数字组成的圈中

规律1: 从任意一个位置xx顺时针走yy步,停下的位置为(x+y%n)%n(x + y \% n ) \% n 规律2: 从任意一个位置xx逆时针走yy步,停下的位置为(x+(ny%n))%n=(x+ny%n)%n(x + (n- y \%n) ) \%n = (x+n -y\%n) \%n

问题

注意下面图Figure 2,3,并不是从00开始的,

  • Figure 1,从起点11开始正走123123步,是哪里?
  • Figure 2,从起点22开始正走124124步,是哪里?
  • Figure 1,从33开始逆走132132步,是哪里?
  • Figure 2,从55开始逆走124124步,是哪里?

circle2

circle3

相关题目

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