【学习笔记】数学知识-约数

约数

  • 若整数 n 除以整数 d 的余数为 0 ,即 d 能整除 n ,则称 dn 的约数, nd 的倍数,记为 d|n 。若整数 n 除以整数 d 的余数不为 0 ,即 d 不能整除 n ,则记为 dn
  • 性质
    • n 为正整数,则 i=1n[i|n]2n
    • n 为正整数,则 i=1nd=1i[d|i]n×logn
  • gcd(a,b) 表示 ab 的最大公约数,同理可推广到 gcd(a,b,c,)
    • gcd(a,b) 在数学中用符号记作 (a,b)
    • 性质
      • 特别地,若 a>0 ,有 gcd(a,0)=a
      • n,a,b 为正整数,且有 2n,a<bn ,则 max{gcd(a,b)}=n2
      • n,m 均为正整数,则 gcd(n!,m!)=min(n,m)!
  • lcm(a,b) 表示 ab 的最小公倍数,同理可推广到 lcm(a,b,c,)
    • lcm(a,b) 在数学中用符号记作 [a,b]
    • 性质
      • n,a,b 为正整数,且有 a,bn ,则 max{lcm(a,b)}={1n=1n(n1)n1
  • a,bN ,则 gcd(a,b)×lcm(a,b)=a×b

九章算术·更相减损法

  • a,bN,ab ,则 gcd(a,b)=gcd(a,ba)=gcd(b,ba)
    • 证明:设 d=gcd(a,b),k1=ad,k2=bd ,移项得 a=k1d,b=k2d ,又因为 d|(ba),ba=(k2k1)d ,故 gcd(a,ba)=gcd(k1d,(k2k1)d)=dbba 同理。
  • a,b,cN,abc ,则 gcd(a,b,c)=gcd(a,ba,cb)
    • 证明:设 d=gcd(a,b),k1=ad,k2=bd ,移项得 a=k1d,b=k2d ,又因为 d|(ba),ba=(k2k1)d ,故 gcd(a,ba)=gcd(k1d,(k2k1)d)=dbba 同理。
  • a,bN ,则 gcd(2a,2b)=2gcd(a,b)
    • 例题
      • luogu P2152 [SDOI2009] SuperGCD
        • 考虑对更相减损法进行优化:
          • a,b 均为偶数时,有 gcd(a,b)=2×gcd(a2,b2)
          • a 为偶数, b 为奇数时,有 gcd(a,b)=gcd(a2,b)
          • b 为偶数, a 为奇数时,有 gcd(a,b)=gcd(a,b2)
        • 代码
  • 应用
    • n 为正整数,则 i=1ngcd(i,n)={nnmod2=1n2nnmod2=0
      • luogu P10031 「Cfz Round 3」Xor with Gcd
      • 证明
        • 依据更相减损法,有 gcd(n,x)=gcd(n,nx) ,即与 n 互质的数 x,nx 成对出现。
        • n 为奇数时,有 i=1ngcd(i,n)=ni=1n12gcd(i,n)gcd(n1,n)=n 。当 n 为偶数时,有 i=1ngcd(i,n)=ngcd(n2,n)i=1n21gcd(i,n)gcd(n1,n)=ngcd(n2,n)=n2n

欧几里得算法

  • a,bN ,则 gcd(a,b)=gcd(b,amodb)
    • 证明

      • a<b ,则 gcd(b,amodb)=gcd(b,a)=gcd(a,b)
      • ab ,设 d=gcd(a,b),a=q×b+r(0r<b) ,则 r=amodb=aq×b ,又因为 d|a,d|b,d|(q×b) ,则 d|(aq×b) ,即 d|r ,故 gcd(a,b)=gcd(b,r)=gcd(b,amodb)
    • 时间复杂度为 O(logmax(a,b))

    • 代码实现

      点击查看代码
      int gcd(int a, int b)
      {
      	return b?gcd(b,a%b):a;
      }
      
    • 例题

扩展欧几里得算法

  • 裴蜀定理(贝祖定理, Bézout 定理)

    • 对于任意一对整数 a,b ,存在一对整数 x,y ,满足 ax+by=gcd(a,b)
      • 证明
        • b=0 时,有一对整数 x=1,y=0 满足 a×1+0×0=a=gcd(a,0)
        • b0 时,则 gcd(a,b)=gcd(b,amodb) 。假设存在一对整数 x,y ,满足 b×x+(amodb)×y=gcd(b,amodb) ,又因为 b×x+(amodb)×y=b×x+(ab×ab)×y=a×y+b×(xab×y) ,所以令 x=y,y=xab×y ,此时有 ax+by=gcd(a,b)
    • 应用
      • a,b 为正整数且互质,则不在集合 {ax+by|x,yN} 中的最大正整数为 abab
        • luogu P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
        • 证明
          • ax+by=abab 无非负整数解。
            • 证明:易得两组解 {x1=b1y1=1,{x1=1y1=a1 。利用 exgcd 不难求出 ax+by=abab 的一组特解 x0,y0 ,则其通解可以表示为 {x=x0+kby=y0ka ,其中 kZ ,即 k 取遍整数集合。设 {b1=x0+k1b1=y0k1a,{1=x0+k2ba1=y0k2a ,易得 k1k2=1 ,故 ax+by=abab 无非负整数解。
          • ax+by=abab+c 有非负整数解,其中 c 为正整数。
            • 证明:利用 exgcd 不难求出 ax+by=abab+c 的一组特解 x0,y0 ,则其通解可以表示为 {x=x0+kby=y0ka ,其中 kZ ,即 k 取遍整数集合。取一组解 x,y 使得 0xb1

              0axaba

              byax+byaba+by

              byabab+caba+by

              b+c=cbby

              cb1y

              又因为 b,cN

              0<cb

              1<cb1y

              又因为 yN

              ax+by=abab+c 有非负整数解,其中 c 为正整数。

    • 推广
  • 代码实现

    点击查看代码
    int exgcd(int a,int b,int &x,int &y)
    {
    	if(b==0)
    	{
    		x=1;
    		y=0;
    		return a;
    	}
    	else
    	{
    		int d=exgcd(b,a%b,y,x);
    		y-=a/b*x;
    		return d;
    	}
    }
    
    • 上述程序求出方程 ax+by=gcd(a,b) 的一组特解 x0,y0 ,并返回 a,b 的最大公约数 d
  • 推广

    • 对于更为一般的方程 ax+by=c ,它有整数解当且仅当 gcd(a,b)|c
      • d=gcd(a,b),p=bd,q=ad
      • 特解:先求出 ax+by=d 的一组特解 x0,y0 ,此时就得到了 ax+by=c 的一组特解 {x0=cd×x0y0=cd×y0
      • x 的最小正整数解为 xmin=x0+1x0p×p ,此时 y0=y01x0p×q
        • y>0 ,即存在正整数解时,正整数解的数量为 y1q+1x 的最大正整数解为 xmax=x0+y1q×py 的最小正整数解为 ymin=((y1)modq)+1y 的最大正整数解为 ymax=y0
        • y0 ,即不存在正整数解时, y 的最小正整数解为 ymin=y0+1y0q×q
      • luogu P5656 【模板】二元一次不定方程 (exgcd)
        • 通解: {x=cd×x0+pky=cd×y0qk 。其中 x0,y0,d 的定义同上, k 取遍整数集合 Z
  • 例题

数论分块(整除分块)

posted @   hzoi_Shadow  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
扩大
缩小
点击右上角即可分享
微信分享提示