数论相关。

裴蜀定理

a,b 不全为 0, 则 : ax+by=gcd(a,b) 有解。

exgcd :

考虑辗转相除法 gcd(a,b)=gcd(b,amodb)

然后已经知道

bx+(amodb)y=d

bx+(aab×b)y=d

ay+b(xab×y)=d

然后有 xy,y(xab×y)


int ex_gcd(int a, int b, int& x, int& y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  int d = ex_gcd(b, a % b, x, y);
  int temp = x;
  x = y;
  y = temp - a / b * y;
  return d;
}

抄 wiki 的,当然前提是 d|c, 这是显然的。

欧拉定理

gcd(a,m)=1 的前提下 :

aφ(m)abmodφ(m)(modm)

扩展欧拉定理

ab{ab,b<φ(m)abmodφ(m)+φ(m),bφ(m)modm

证明一下:

φ(n)n2(odd)

φ(n)>odd(even)

故为 log 次。

lucas 定理

(nm)(n/pm/p)(nmodpmmodp)(modp)

简单互质。

扩展中国剩余定理

很暴力啊兄弟。

bixiai(modpi)

这一类的问题该怎么做?考虑增量法。

已经知道前 i1 个问题的解是 ans, 考虑这 i 个数的 lcm 是 m。然后 ans+mxi 是前 i1 个问题的通解。稍微变换 :

bi(ans+mxi)ai(modpi)

bim(xi)+y(pi)=(aibians)

同时建议使用取模优化。

稍微做了点杂题。

  • P2480 [SDOI2010]古代猪文

先用欧拉定理化开式子,发现模数变成了一个
squre-free number 啊。

考虑使用 lucas 暴力求值。

  • P4139 上帝与集合的正确用法

iphi(i) 这样的迭代次数是 log2 次的, 所以欧拉定理直接算就行了。

  • P4774 [NOI2018] 屠龙勇士

考虑使用平衡树来维护这个武器,然后化成若干个线性同余方程组,使用 exCRT 求解即可。

数论分块

  • P2261 [CQOI2007]余数求和

i=1nkmodi

可以考虑先求 :

i=1nkii

然后考虑枚举 kik 种取值。

枚举 l,r 这两个左右端点,然后使用等差数列公式即可求值。

特别的 :

r=kki

这个是显然的,然后 l=r+1 就行了。

  • P2260 [清华集训2012]模积和

nm

i=1n(nmodi)×i=1mmmodii=1n(nmodi)×(mmodi)

考虑左边随便算,右边仔细做。

i=1n(nmnimimini+i2nimi)

这里懒得展开了。后面那一项咋做呢?可以使用平方和公式 i2=n(n+1)(2n+1)6

无所谓,我会插值。

关于 n,m 除法分块的仔细实现:可以考虑调到更小的一个地方取个 min.

莫比乌斯相关。

初涉反演魔术。

考虑记录 μ(i),当 i 是完全平方数的倍数,μ(i)=0, 否则,μ(i)=(1)k,其中 k 代表质因子个数,显然的 μ(1)=1

那这个是不是可以进行筛法,显然。


void getMu() {
  mu[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!flg[i]) p[++tot] = i, mu[i] = -1;
    for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
      flg[i * p[j]] = 1;
      if (i % p[j] == 0) {
        mu[i * p[j]] = 0;
        break;
      }
      mu[i * p[j]] = -mu[i];
    }
  }
}
  • Lemma1 : d|nμ(d)=0, 特地的,在 n=1 时不成立。

考虑算数唯一分解定理。

n=i=1kpici,s=i=1kpi

d|nμ(d)=d|sμ(d)=i=0k(ki)(1)i=(1+(1))k

可以看出来,会一点组合数学是好的。

然后可以有 Lemma2 :

[gcd(i,j)=1]=d|gcd(i,j)μ(d)

这个其实比较讨巧 μ(1)=1,是不是很简单 (

  • Theorem:

f(n),g(n) 是两个数论函数,有如下变幻魔术 :

f(n)=d|ng(d)g(n)=d|nμ(d)f(nd)

证明 :

d|nμ(d)f(nd)=d|nμ(d)k|ndg(k)=k|ng(k)d|nkμ(d)=g(n)

为啥最后一步是直接相等的呢?右边的和式在 d=n=1 时才为 1, 这个所以证明完毕。

  • Bonus:

f(n)=n|dg(d)g(n)=n|dμ(dn)f(d)

证明 :

n|dμ(dn)f(d)=d=1+μ(d)f(nd)

d=1+μ(d)nd|pg(p)=p=1+g(np)d|pμ(d)

我母鸡,好像右边等于要证的,然后就做完了。

狄利克雷卷积

老师有没有教过你先点满技能再来写题???

两个积性函数
f,g ,它们的狄利克雷卷积为 :

h(n)=(fg)(n)=d|nf(d)g(nd)

h=fg,性质有:交换律,结合律,所得 h 是积性函数。

常见的 mark

ϵ(n)=[n=1],I(n)=1,id(n)=n

ϵ 是这一运算的单位元 fϵ=f,然后常见结论 :

  • μI=ϵ 这个是显然的。

  • φI=id 这个就是 d|nφ(d)=n

  • idμ=φ 考虑 φIμ=idμ=φ

超小伟的,这个是很难的啦。

题目

很难的啦。

  • P3455 [POI2007]ZAP-Queries

a[1,n],b[1,m],gcd(a,b)=k.

考虑 nnk,mmk

i=1ni=1m[gcd(i,j)=1]

i=1ni=1md|gcd(i,j)μ(d)

然后考虑 d 对于这些东东的贡献,这个就好做了。

d=1nμ(i)ndmd

考虑算一下 μ , 分块。

  • P2522 [HAOI2011]Problem b

上面那个题带了个上下界。

可以考虑变成一个几何题,类似二维前缀和的容斥。

s[1l][1r]s[1l][1r1]s[1l1][1r]+s[1l1][1r1]

四次计算。

  • P2257 YY的GCD

kprime.

pprii=1ni=1md|gcd(i,j)μ(d)

pprid=1nμ(i)ndmd

我只是劣质的搬运工,很难的啦。

整体换元 wdp

w=1nnwmwd|wμ(wd)[dpri]

考虑为啥是 μ(wd) ?我们原本枚举的是 d 这时候 dd=T 所以是这样的。

后面那个好像可以很快算出来,理应是亚线性的?

  • P4449 于神之怒加强版

我测,小学生数学题!!

pgcd(i,j)pki=1nj=1n[gcd(i,j)=1]

pgcd(i,j)pki=1ni=1md| pμ(d)

pgcd(i,j)pkd=1μ(d)ndpmdp

好了,换元 wdp

w=1nwmwd|wμ(wd)dk

注意别把 p,d 弄混了。

后面那个直接 nlnn 的调和级数乱算就行了。

不过后面那个好像可以直接筛。

一点点 yyc 的魔法。

可以考虑构建起一点点数论的体系。

先是简易的 ϵ(n)=[n=1],I(n)=1

μ(d)=1 可知 μ=I1 在 dirichelt 卷积下。

考虑算数唯一分解定理,对于一个质数集合,大小为 |p|

n=(c1,c2,c3,.....,c|p|)

然后我们可以把数看成一个高维点。然后建立起了与普通情况的联系。

divf(n)=d|nf(d)

mulf(n)=n|df(d)

这两种本质上对应着高维前缀和,高维后缀和。所以对其求和的时候要注意着其大小的关系。

事实上我们可以模仿 SOS DP 考虑每一次对于向量 n 某一位加一减一进行求和。

我们考虑对于这一个问题进行容斥求和的过程,叫做高维差分。

实质上可以用上文提及的莫比乌斯反演定理解决。

P2714 四元组统计

考虑对于 ocurn 进行倍数求和得到 f(n)

那么 (f(n)4) 即为满足 gcd 是 n 的倍数的方案数。

此时考虑莫比乌斯反演即可。做一个高维差分解决问题。

for (int i = 1; p[i] <= lim; i ++)
	for (int j = lim / p[i]; j; j --)
		f[j] += f[j * p[i]];
for (int i = 1; p[i] <= lim; i ++)
	for (int j = 1; j * p[i] <= lim; j ++)
		f[j] -= f[j * p[i]];

CF915G Coprime Arrays

乱算一通有这一个狮子:

f(n)=μ(d)kdn

可以整除分块,但过不了一点。

这个时候可以考虑求后面柿子的差分然后累计即可。

杜教筛。

s(n)=f(i) 的方法。

考虑找到一个 g

求狄利克雷卷积有:

(fg)(i)=d|ig(d)f(id)

=g(i)s(ni)

g(1)s(n)=i=1g(i)s(ni)i=2g(i)s(ni)

考虑 fg 的意义可以巧妙地将其消去,然后可以对于右边运用整除分块递归求解,复杂度不太会算。

ϕ

总所周知 ϕI=id 这个是好算的,然后直接运用一个求和公式即可。

μ

感觉不如 μI=ϵ

对于诸如 ϕid 此类,乘上 id 即可消去。

P3768 简单数学题

i=1j=1ijgcd(i,j)

考虑直接欧拉反演。

i=1j=1ijd|gcd(i,j)ϕ(d)

然后提出来 d。

d=1ϕ(d)d|id|jij

提出来 d again。

d=1ϕ(d)d2i=1ndj=1ndij

后面是一个求和。

d=1ϕ(d)d2S2(nd)

对于左边用杜教筛。

(fg)(n)=d|nϕ(d)d2(nd)2

(fg)(n)=d|nϕ(d)n2

(fg)(n)=n3

然后套上杜教筛公式。

s(n)=i3g(i)s(nd)

g(i) 可以用平方和公式解决,然后我们就做完了这个杀软题。

posted @   Cust10  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示