良心发现,时隔一年再回首莫比乌斯反演(公式性质证明+题目练习)

文章目录

  • 莫比乌斯反演
    • 引入
    • 公式
    • 性质
    • 模板
    • 公式证明
  • 莫比乌斯函数前缀和
  • 题目练习
    • 完全平方数
    • [HAOI2011]Problemb
    • YY的GCD
    • [SDOI2014]数表
    • [国家集训队]Crash的数字表格/JZPTAB
    • [SDOI2015]约数个数和

寒假疫情期间跟着lmm学了一遍,完全是懵逼到底状态,以至于后面考到或者做到相关知识的题目,完全是非洲人。今天跟着h老师重新学了一遍,虽然可能自己还是不会推🍔,但至少看得懂了吧

莫比乌斯反演


莫比乌斯反演形式的式子形如 F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=dnf(d),一般而言 F(n)F(n)F(n) 是非常好求的,而 f(x)f(x)f(x) 即为要求的信息。

引入

F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=dnf(d)
通过这个例子,可以暴力打出下列表

F(1)F(1)F(1)f(1)f(1)f(1)
F(2)F(2)F(2)f(1)+f(2)f(1)+f(2)f(1)+f(2)
F(3)F(3)F(3)f(1)+f(3)f(1)+f(3)f(1)+f(3)
F(4)F(4)F(4)f(1)+f(2)+f(4)f(1)+f(2)+f(4)f(1)+f(2)+f(4)
F(5)F(5)F(5)f(1)+f(5)f(1)+f(5)f(1)+f(5)
F(6)F(6)F(6)f(1)+f(2)+f(3)+f(6)f(1)+f(2)+f(3)+f(6)f(1)+f(2)+f(3)+f(6)
F(7)F(7)F(7)f(1)+f(7)f(1)+f(7)f(1)+f(7)
F(8)F(8)F(8)f(1)+f(2)+f(4)+f(8)f(1)+f(2)+f(4)+f(8)f(1)+f(2)+f(4)+f(8)

转换一下,得到新表

f(1)f(1)f(1)F(1)F(1)F(1)
f(2)f(2)f(2)F(2)−F(1)F(2)-F(1)F(2)F(1)
f(3)f(3)f(3)F(3)−F(1)F(3)-F(1)F(3)F(1)
f(4)f(4)f(4)F(4)−F(2)F(4)-F(2)F(4)F(2)
f(5)f(5)f(5)F(5)−F(1)F(5)-F(1)F(5)F(1)
f(6)f(6)f(6)F(6)−F(3)−F(2)+F(1)F(6)-F(3)-F(2)+F(1)F(6)F(3)F(2)+F(1)
f(7)f(7)f(7)F(7)−F(1)F(7)-F(1)F(7)F(1)
f(8)f(8)f(8)F(8)−F(4)F(8)-F(4)F(8)F(4)

看看能观察到fffFFF之间存在什么规律??
🚨 重点关注f(1),f(4),f(6),f(8)f(1),f(4),f(6),f(8)f(1),f(4),f(6),f(8)
🧀 f(6)=F(61)−F(62)−F(63)+F(66)f(6)=F(\frac{6}{1})-F(\frac{6}{2})-F(\frac{6}{3})+F(\frac{6}{6})f(6)=F(16)F(26)F(36)+F(66)
在这里插入图片描述

发现规律 其实是知道公式了

F(nd)F(\frac{n}{d})F(dn)ddd质因数分解p1k1...pikip_1^{k_1}...p_i^{k_i}p1k1...piki,如果各质数指数均为111,则该F(nd)F(\frac{n}{d})F(dn)才会存在 ,特别地,当d=1d=1d=1时也一定存在

🍗:f(8)=F(81)−F(82)f(8)=F(\frac{8}{1})-F(\frac{8}{2})f(8)=F(18)F(28)
F(81):1F(\frac{8}{1}):1F(18)1存在
F(82):2F(\frac{8}{2}):2F(28)2质因数分解212^121,存在
F(2)=F(84):4F(2)=F(\frac{8}{4}):4F(2)=F(48)4质因数分解222^222,不存在
F(1)=F(88):8F(1)=F(\frac{8}{8}):8F(1)=F(88)8质因数分解232^323,不存在

F(nd)F(\frac{n}{d})F(dn)前面的符号取决于ddd所含质因子的个数/种类的奇偶性,(−1)k(-1)^k(1)k

🍗:f(6)=F(61)−F(62)−F(63)+F(66)f(6)=F(\frac{6}{1})-F(\frac{6}{2})-F(\frac{6}{3})+F(\frac{6}{6})f(6)=F(16)F(26)F(36)+F(66)
F(61):1F(\frac{6}{1}):1F(16)1不含任何质因子,系数为(−1)0=1(-1)^0=1(1)0=1
F(62):2F(\frac{6}{2}):2F(26)2含质因子222,系数为(−1)1=−1(-1)^1=-1(1)1=1
F(63):3F(\frac{6}{3}):3F(36)3含质因子333,系数为(−1)1=−1(-1)^1=-1(1)1=1
F(66):6F(\frac{6}{6}):6F(66)6含质因子2,32,32,3,系数为(−1)2=1(-1)^2=1(1)2=1
在这里插入图片描述


公式

引入中发现的规律经过数学 提炼加工打磨 规范,将(−1)k(-1)^k(1)k定义为μ(i)\mu (i)μ(i)
便成为了一个优美的🍔
F(n)=∑d∣nf(n)⇒f(n)=∑d∣nμ(d)F(nd)F(n)=\sum_{d|n}f(n)\Rightarrow f(n)=\sum_{d|n}\mu (d)F(\frac{n}{d})F(n)=dnf(n)f(n)=dnμ(d)F(dn)

其中μ(d)\mu(d)μ(d)为莫比乌斯函数,定义如下:

  1. d=1,μ(d)=1d=1,\mu(d)=1d=1,μ(d)=1
  2. ddd能改写为p1p2...pkp_1p_2...p_kp1p2...pk互异质数的积,则μ(d)=(−1)k\mu(d)=(-1)^kμ(d)=(1)k
  3. otherwiseotherwiseotherwise,其余情况μ(d)=0\mu(d)=0μ(d)=0

性质

  • 性质一:
    对于任意的正整数nnn有:
    ∑d∣nμ(d)={1(n=1)0(n≠1)\sum_{d|n}\mu(d)=\left\{ \begin{aligned} 1&&(n=1)\\ 0&&(n≠1) \end{aligned} \right. dnμ(d)={10(n=1)(n=1)
    证明:
    Ⅰ. 当n=1n=1n=1时,μ(1)=1\mu(1)=1μ(1)=1,显然成立
    Ⅱ. 当n≠1n≠1n=1时,将nnn质因数分解为p1a1p2a2...pkaip_1^{a_1}p_2^{a_2}...p_k^{a_i}p1a1p2a2...pkai
    只有所有质因子的指数都为111的因数的μ\muμ值不为000
    则其中有xxx个不同质因子的个数为CkxC_k^xCkx,于是有
    ∑d∣nμ(d)=Ck0−Ck1+Ck2....=∑i=0k(−1)iCki\sum_{d|n}\mu(d)=C_k^0-C_k^1+C_k^2....=\sum_{i=0}^k(-1)^iC_k^idnμ(d)=Ck0Ck1+Ck2....=i=0k(1)iCki
    🧀二项式展开公式为:
    (X+Y)n=∑i=0nCniXiYn−i(X+Y)^n=\sum_{i=0}^nC_n^iX^iY^{n-i}(X+Y)n=i=0nCniXiYni
    X=1,Y=−1X=1,Y=-1X=1,Y=1带入即可得到:
    ∑i=0k(−1)iCki=[1+(−1)]k=0\sum_{i=0}^k(-1)^iC_k^i=[1+(-1)]^k=0i=0k(1)iCki=[1+(1)]k=0

  • 性质二:
    对于任意的正整数nnn有:
    ∑d∣nμ(d)d=ϕ(n)n\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}dndμ(d)=nϕ(n)
    证明:
    ∑d∣nμ(d)d=ϕ(n)n⇔n×∑d∣nμ(d)d=ϕ(n)\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}\Leftrightarrow n\times \sum_{d|n}\frac{\mu(d)}{d}=\phi(n)dndμ(d)=nϕ(n)n×dndμ(d)=ϕ(n)
    F(n)=n,f(n)=ϕ(n)F(n)=n,f(n)=\phi(n)F(n)=n,f(n)=ϕ(n),则有
    f(n)=n×∑d∣nμ(d)d=∑d∣nμ(d)nd=∑d∣nμ(d)F(nd)f(n)=n\times \sum_{d|n}\frac{\mu(d)}{d}=\sum_{d|n}\mu(d)\frac{n}{d}=\sum_{d|n}\mu(d)F(\frac{n}{d})f(n)=n×dndμ(d)=dnμ(d)dn=dnμ(d)F(dn)
    🚨不要忘记f(n)=∑d∣nμ(d)F(nd)f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})f(n)=dnμ(d)F(dn)成立的前提是F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=dnf(d)
    所以如果性质二要想成立,就必须再证明n=∑d∣nϕ(d)n=\sum_{d|n}\phi(d)n=dnϕ(d)
    考虑从物理意义角度出发
    k∈[1,n],gcd(n,k)=d⇒gcd(n/d,k)=1k∈[1,n],gcd(n,k)=d\Rightarrow gcd(n/d,k)=1k[1,n]gcd(n,k)=dgcd(n/d,k)=1,将kkk分到Cn/dC_{n/d}Cn/d类中
    🍗:n=8n=8n=8
    {1,3,5,7gcd=1ϕ(81)=42,6gcd=2ϕ(82)=24gcd=4ϕ(84)=18gcd=8ϕ(88)=1\left\{ \begin{aligned} 1,3,5,7&&gcd=1&&\phi(\frac{8}{1})=4\\ 2,6&&gcd=2&&\phi(\frac{8}{2})=2\\ 4&&gcd=4&&\phi(\frac{8}{4})=1\\ 8&&gcd=8&&\phi(\frac{8}{8})=1 \end{aligned} \right.1,3,5,72,648gcd=1gcd=2gcd=4gcd=8ϕ(18)=4ϕ(28)=2ϕ(48)=1ϕ(88)=1
    在这里插入图片描述

  • 性质三:
    莫比乌斯函数是一个积性函数
    但我不会证明
    在这里插入图片描述

🧀
积性函数的定义:对于任意互质的整数aaabbb有性质f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b)的数论函数
完全积性函数定义:对于任意的整数aaabbbf(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b)的数论函数
积性函数的性质:

  1. f(1)=1f(1)=1f(1)=1
  2. 积性函数的前缀和也是积性函数

模板

因为莫比乌斯函数是一个积性函数,我们就可以线性筛求出其值
由此联想到我们以前会的求质数的欧拉筛法

void sieve() {mu[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) {vis[i] = 1;mu[i] = -1;prime[++ cnt] = i;}for( int j = 1;j <= cnt && i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0; //i*prime[j]这个数至少含有prime[j]^2 break;}mu[i * prime[j]] = - mu[i];//多了prime[j]这一种新的质因子 所以要与原来取相反数/*只要i*prime[j]含有pi^2早晚都会进if语句*/ }}
}

公式证明

说到底,好像我们似乎貌似仿佛并没有证明这个定理,就直接提上裤子跑了


  • 形式一
    证明:
    F(n)=∑d∣nf(n)⇒f(n)=∑d∣nμ(d)F(nd)=∑d∣nμ(d)∑k∣ndf(k)F(n)=\sum_{d|n}f(n)\Rightarrow f(n)=\sum_{d|n}\mu (d)F(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)F(n)=dnf(n)f(n)=dnμ(d)F(dn)=dnμ(d)kdnf(k)
    d∣n,k∣nd⇒k∣n{d|n,k|\frac{n}{d}\Rightarrow k|n}dn,kdnkn,可以感性理解ddd取不同值,kkk会把nnn所有因数都枚举到
    于是可以把kkk固定下来,更改ddd的取值范围,类似于两层循环顺序的互调??
    在这里插入图片描述

=∑k∣nf(k)∑d∣nkμ(d)=\sum_{k|n}f(k)\sum_{d|\frac{n}{k}}\mu(d)=knf(k)dknμ(d)
将性质一的结论运用上,∑d∣nkμ(d)\sum_{d|\frac{n}{k}}\mu(d)dknμ(d)当且仅当nk=1\frac{n}{k}=1kn=1时,求和莫比乌斯函数值≠0≠0=0
=f(n)=f(n)=f(n)
证明过程用到了性质一,性质一本身其实是独立于公式的,所以并不是伪证


  • 形式二
    F(n)=∑n∣df(d)⇒f(n)=∑n∣dμ(dn)F(d)F(n)=\sum_{n|d}f(d)\Rightarrow f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)F(n)=ndf(d)f(n)=ndμ(nd)F(d)
    证明:
    与形式一的证明大致相同
    k=dnk=\frac{d}{n}k=nd
    =∑k=1+∞μ(k)F(n×k)=∑k=1+∞μ(k)∑n×k∣pf(p)=∑n∣pf(p)∑k∣pnμ(k)=\sum_{k=1}^{+∞}\mu(k)F(n\times k)=\sum_{k=1}^{+∞}\mu(k)\sum_{n\times k|p}f(p)=\sum_{n|p}f(p)\sum_{k|\frac{p}{n}}\mu(k)=k=1+μ(k)F(n×k)=k=1+μ(k)n×kpf(p)=npf(p)knpμ(k)
    在这里插入图片描述

当且仅当pn=1,p=n\frac{p}{n}=1,p=nnp=1,p=n∑k∣npμ(k)=1\sum_{k|\frac{n}{p}}\mu(k)=1kpnμ(k)=1,其余全为000
=f(n)=f(n)=f(n)
一般这种形式更常用一些


莫比乌斯函数前缀和

基本上莫比乌斯反演的题目都会和分块绑定在一起,此时的莫比乌斯函数就需要进行前缀和
接下来就让我们一起来深挖一下分块部分
🍗
Q=∑i∣dμ(i)⌊ni⌋Q=\sum_{i|d}\mu(i)\lfloor{\frac{n}{i}}\rfloorQ=idμ(i)in
不妨设n=10n=10n=10,如果按照⌊ni⌋\lfloor{\frac{n}{i}}\rfloorin1≤i≤n1\le i\le n1in进行分类
则有10={1},5={2},3={3},2={4,5},1={6,7,8,9,10}10=\{1\},5=\{2\},3=\{3\},2=\{4,5\},1=\{6,7,8,9,10\}10={1},5={2},3={3},2={4,5},1={6,7,8,9,10}
反映在平面直角坐标系上,看看是什么样👀
在这里插入图片描述
按照x\sqrt{x}x做分割线,前半段的xxx最多只有x\sqrt{x}x段,后半段的yyy最多只有x\sqrt{x}x
在这里插入图片描述
拼接在一起,则⌊ni⌋\lfloor{\frac{n}{i}}\rfloorin最多只有2n2\sqrt{n}2n个取值
n/in/in/i即为iii所在的块,n/(n/i)n/(n/i)n/(n/i)则为该块右端点值
在这里插入图片描述

block = n / i;
r = n / block;

因为[i,n/(n/i)][i,n/(n/i)][i,n/(n/i)]这一段的⌊ni⌋\lfloor{\frac{n}{i}}\rfloorin均相等
所以我们就可以对μ\muμ进行前缀和,直接O(1)O(1)O(1)计算出这一段区间的sumsumsum
就不必再老实地一个一个往后推
老实人永远会被出题人吊起来抽
这个思想会在后面的题里反复出现,所以提前放出来

一般情况下,莫比乌斯反演后都是求 f(1)f(1)f(1) 因为这个时候 f(1)=∑i=1infμ(i)F(i)f(1)=\sum_{i=1}^{inf}\mu(i)F(i)f(1)=i=1infμ(i)F(i) 才能连续地整除分块

infinfinf 是取决于 FFF 函数在什么时候开始就一直取值为 000,后面的信息没有贡献即可停止枚举


题目练习

完全平方数

  • solution

考虑二分答案,转化为求[1,x][1,x][1,x]之间的无平方因子的个数
tot=0tot=0tot=0个质数乘积的平方的倍数的数的个数(111的倍数)
−1-11个质数乘积的平方的倍数的数的个数(4[22]4[2^2]4[22]的倍数,9[32]9[3^2]9[32]的倍数…)
+2+2+2个质数乘积的平方的倍数的数的个数(36[(2×3)2]36[(2\times 3)^2]36[(2×3)2]的倍数…)
发现每个乘积前面的系数刚好是μ(i)\mu(i)μ(i)
🍗:μ(3)=−1\mu(3)=-1μ(3)=1,故999对答案的贡献为负,μ(6)=1\mu(6)=1μ(6)=1,故363636对答案的贡献为正
xxx以内的i2i^2i2的个数为xi2\frac{x}{i^2}i2x
⇒tot(x)=∑i=1xμ(i)xi2\Rightarrow tot(x)=\sum_{i=1}^{\sqrt{x}}\mu(i)\frac{x}{i^2}tot(x)=i=1xμ(i)i2x
这道题仅是莫比乌斯函数的运用,并非莫比乌斯反演
在这里插入图片描述

  • code
#include <cstdio>
#define int long long
#define maxn 1000005
int T, k, cnt;
int mu[maxn], prime[maxn];
bool vis[maxn];void init() {mu[1] = 1;for( int i = 2;i < maxn;i ++ ) {if( ! vis[i] ) mu[i] = -1, prime[++ cnt] = i;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}	
}int check( int x ) {int ans = 0;for( int i = 1;i * i <= x;i ++ )ans += x / ( i * i ) * mu[i];return ans;
}signed main() {init();scanf( "%lld", &T );while( T -- ) {scanf( "%lld", &k );int l = 1, r = ( k << 1 );while( l <= r ) {int mid = ( l + r ) >> 1;if( check( mid ) >= k ) r = mid - 1;else l = mid + 1;}if( check( l ) == k ) printf( "%lld\n", l );else printf( "%lld\n", r );}return 0;
}

[HAOI2011]Problemb

  • solution

a≤x≤b,c≤y≤da\le x\le b,c\le y\le daxb,cyd二维差分成四个询问
每次询问1≤x≤n,1≤y≤m1\le x\le n,1\le y\le m1xn,1ymgcd(x,y)=kgcd(x,y)=kgcd(x,y)=k的数对数量
然后再转化为1≤x≤nk,1≤y≤mk1\le x\le \frac{n}{k},1\le y\le \frac{m}{k}1xkn,1ykm内的互质的数对数量

定义f(i):gcd(x,y)=if(i):gcd(x,y)=if(i):gcd(x,y)=i的数对数量,F(i):i∣gcd(x,y)F(i):i|gcd(x,y)F(i):igcd(x,y)的数对数数量
(1≤x≤n,1≤y≤m)(1\le x\le n,1\le y\le m)(1xn,1ym)

⇒F(i)=⌊ni⌋⌊mi⌋⇒f(i)=∑i∣dμ(di)F(i)=∑i∣dμ(di)⌊ni⌋⌊mi⌋\Rightarrow F(i)=\lfloor{\frac{n}{i}}\rfloor\lfloor{\frac{m}{i}}\rfloor\Rightarrow f(i)=\sum_{i|d}\mu(\frac{d}{i})F(i)=\sum_{i|d}\mu(\frac{d}{i})\lfloor{\frac{n}{i}}\rfloor\lfloor{\frac{m}{i}}\rfloorF(i)=inimf(i)=idμ(id)F(i)=idμ(id)inim
🧀⌊ni⌋⌊mi⌋\lfloor{\frac{n}{i}}\rfloor\lfloor{\frac{m}{i}}\rfloorinim其实是一段一段的区间,最多2(n+m)2(\sqrt{n}+\sqrt{m})2(n+m)个,从这里入手枚举
那么就需要对前面的∑i∣dμ(di)\sum_{i|d}\mu(\frac{d}{i})idμ(id)前缀和

  • code
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 50005
int n, a, b, c, d, k, cnt;
bool vis[maxn];
int prime[maxn], mu[maxn], pre[maxn];void init() {mu[1] = 1;	for( int i = 2;i < maxn;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for( int i = 1;i < maxn;i ++ ) pre[i] = pre[i - 1] + mu[i];
}int calc( int n, int m ) {if( n > m ) swap( n, m );int last, ans = 0;for( int i = 1;i <= n;i = last + 1 ) {last = min( n / ( n / i ), m / ( m / i ) );ans += ( pre[last] - pre[i - 1] ) * ( n / i ) * ( m / i );}return ans;
}signed main() {init();scanf( "%lld", &n );for( int i = 1, a, b, c, d, k;i <= n;i ++ ) {scanf( "%lld %lld %lld %lld %lld", &a, &b, &c, &d, &k );a --, c --;a /= k, b /= k, c /= k, d /= k;printf( "%lld\n", calc( b, d ) - calc( a, d ) - calc( b, c ) + calc( a, c ) );}return 0;
}

YY的GCD

  • solution

既然要求gcd(x,y)gcd(x,y)gcd(x,y)为质数,而且发现这道题跟上一道problem b很像
先枚举质数,剩下的不就是求1≤x≤n,1≤y≤m,gcd(n,m)=11\le x\le n,1\le y\le m,gcd(n,m)=11xn,1ym,gcd(n,m)=1的数对数量??

定义f(i):gcd(x,y)=if(i):gcd(x,y)=if(i):gcd(x,y)=i的数对数量,F(i):i∣gcd(x,y)F(i):i|gcd(x,y)F(i):igcd(x,y)的数对数数量
(1≤x≤n,1≤y≤m)(1\le x\le n,1\le y\le m)(1xn,1ym)
F(i)=⌊ni⌋⌊mi⌋⇒f(i)=∑i∣dμ(di)F(d)=∑i∣dμ(di)⌊nd⌋⌊md⌋F(i)=\lfloor{\frac{n}{i}}\rfloor\lfloor{\frac{m}{i}}\rfloor\Rightarrow f(i)=\sum_{i|d}\mu(\frac{d}{i})F(d)=\sum_{i|d}\mu(\frac{d}{i})\lfloor{\frac{n}{d}}\rfloor\lfloor{\frac{m}{d}}\rfloorF(i)=inimf(i)=idμ(id)F(d)=idμ(id)dndm🚨gcd(x,y)=igcd(x,y)=igcd(x,y)=i的质数已经提出来枚举了
⇒ans=∑pmin(n,m)f(1)=∑pmin(n,m)∑d=1min(n,m)μ(d)⌊nd×p⌋⌊md×p⌋\Rightarrow ans=\sum_{p}^{min(n,m)}f(1)=\sum_{p}^{min(n,m)}\sum_{d=1}^{min(n,m)}\mu(d)\lfloor{\frac{n}{d\times p}}\rfloor\lfloor{\frac{m}{d\times p}}\rfloorans=pmin(n,m)f(1)=pmin(n,m)d=1min(n,m)μ(d)d×pnd×pm
如果止步于此,获得的只有美丽的黑色

k=d×pk=d\times pk=d×p,则p=k/dp=k/dp=k/d
⇒ans=∑kmin(n,m)⌊nk⌋⌊mk⌋∑p∣kμ(kp)\Rightarrow ans=\sum_{k}^{min(n,m)}\lfloor{\frac{n}{k}}\rfloor\lfloor{\frac{m}{k}}\rfloor\sum_{p|k}\mu(\frac{k}{p})ans=kmin(n,m)knkmpkμ(pk)

最后就只剩下对∑p∣kμ(kp)\sum_{p|k}\mu(\frac{k}{p})pkμ(pk)进行前缀和的处理
这里的处理略微不同于上一道题
可以通过暴力枚举质因子,对质因子的倍数进行μ\muμ的累加,再前缀和处理出来
在这里插入图片描述

  • code
    遇得到哦🙄
    define int long long让我直接慢了1s多,导致TTT了,只能老老实实改long long才能顺利ACACAC
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 10000005
int T, cnt;
int sum[maxn], mu[maxn], prime[maxn];
long long pre[maxn];
bool vis[maxn];void init( int n ) {mu[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for( int j = 1;j <= cnt;j ++ )for( int i = 1;i * prime[j] <= n;i ++ )sum[prime[j] * i] += mu[i];for( int i = 1;i < maxn;i ++ ) pre[i] = pre[i - 1] + sum[i];
}int main() {init( 1e7 );scanf( "%d", &T );int n, m, r;long long ans;while( T -- ) {scanf( "%d %d", &n, &m );if( n > m ) swap( n, m );ans = 0;for( int i = 1;i <= n;i = r + 1 ) {r = min( n / ( n / i ), m / ( m / i ) );ans += 1ll * ( pre[r] - pre[i - 1] ) * ( n / i ) * ( m / i );}printf( "%lld\n", ans );}return 0;
}

[SDOI2014]数表

  • solution

一句话题意,令sum(i)sum(i)sum(i)表示iii的因子和,给定n,m,an,m,an,m,a,求🍔
∑1≤i≤n,1≤j≤msum(gcd(i,j))≤asum(gcd(i,j))\sum_{1\le i\le n,1\le j\le m}^{sum(gcd(i,j))\le a}sum(gcd(i,j))1in,1jmsum(gcd(i,j))asum(gcd(i,j))

先思考此题的弱化版,即不考虑aaa
∑i=1n∑j=1msum(gcd(i,j))\sum_{i=1}^n\sum_{j=1}^msum(gcd(i,j))i=1nj=1msum(gcd(i,j))
F(i)F(i)F(i)表示1≤x≤n,1≤y≤m,i∣gcd(x,y)1\le x\le n, 1\le y\le m,i|gcd(x,y)1xn,1ym,igcd(x,y)的数对个数
f(i)f(i)f(i)表示1≤x≤n,1≤y≤m,gcd(x,y)=i1\le x\le n,1\le y\le m,gcd(x,y)=i1xn,1ym,gcd(x,y)=i的数对个数
则有
F(i)=∑i∣df(d),F(i)=⌊ni⌋⌊mi⌋F(i)=\sum_{i|d}f(d),F(i)=\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloorF(i)=idf(d),F(i)=inim
莫比乌斯反演
f(i)=∑i∣dμ(di)F(d)=∑i∣dμ(di)⌊nd⌋⌊md⌋f(i)=\sum_{i|d}\mu(\frac{d}{i})F(d)=\sum_{i|d}\mu(\frac{d}{i})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloorf(i)=idμ(id)F(d)=idμ(id)dndm
于是,有
ans=∑i=1min(n,m)sum(i)f(i)ans=\sum_{i=1}^{min(n,m)}sum(i)f(i)ans=i=1min(n,m)sum(i)f(i)=∑i=1min(n,m)sum(i)∑i∣dμ(di)⌊nd⌋⌊md⌋=\sum_{i=1}^{min(n,m)}sum(i)\sum_{i|d}\mu(\frac{d}{i})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor=i=1min(n,m)sum(i)idμ(id)dndm=∑d=1min(n,m)⌊nd⌋⌊md⌋∑i∣dsum(i)μ(di)=\sum_{d=1}^{min(n,m)}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\sum_{i|d}sum(i)\mu(\frac{d}{i})=d=1min(n,m)dndmidsum(i)μ(id)
如果现在知道∑i∣dsum(i)μ(di)\sum_{i|d}sum(i)\mu(\frac{d}{i})idsum(i)μ(id),就可以O(sqrtn)O(sqrt{n})O(sqrtn)的计算出答案
sum(i)sum(i)sum(i)可以线性筛得到,与上一题类似,枚举iii暴力更新倍数,前缀和即可,O(logn)O(logn)O(logn)

现在加上限制aaa,又怎么做呢??
其实只有sum(i)≤asum(i)\le asum(i)aiii才会产生贡献
自然而然的想到,将a,sum(i)a,sum(i)a,sum(i)分别排序,树状数组维护
本质就是树状数组在线插入
在这里插入图片描述

至于取模的问题,采取自然溢出的方式即可,具体细节可参见代码

  • code
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100000
#define int long long
struct node {int n, m, a, id;
}q[maxn], s[maxn];
int prime[maxn], mu[maxn + 5], sum[maxn + 5], tree[maxn + 5], result[maxn + 5];
bool vis[maxn + 5];
int cnt;bool cmp( node x, node y ) {return x.a < y.a;
}void init() {mu[1] = 1;for( int i = 2;i <= maxn;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] <= maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for( int i = 1;i <= maxn;i ++ )for( int j = i;j <= maxn;j += i ) sum[j] += i;for( int i = 1;i <= maxn;i ++ )s[i].a = sum[i], s[i].id = i;sort( s + 1, s + maxn + 1, cmp );
}int lowbit( int x ) {return x & ( -x );
}void add( int x, int v ) {for( int i = x;i < maxn;i += lowbit( i ) )tree[i] += v;
}int query( int x ) {int ans = 0;for( int i = x;i;i -= lowbit( i ) )ans += tree[i];return ans;
}int solve( int n, int m ) {if( n > m ) swap( n, m );int ans = 0, r;for( int i = 1;i <= n;i = r + 1 ) {r = min( n / ( n / i ), m / ( m / i ) );ans += ( n / i ) * ( m / i ) * ( query( r ) - query( i - 1 ) );}return ans;
}void Add( int id ) {for( int i = 1;i * id <= maxn;i ++ )add( i * id, mu[i] * sum[id] );
}signed main() {int Q;scanf( "%lld", &Q );for( int i = 1;i <= Q;i ++ )scanf( "%lld %lld %lld", &q[i].n, &q[i].m, &q[i].a ), q[i].id = i;sort( q + 1, q + Q + 1, cmp );init();int now = 0;for( int i = 1;i <= Q;i ++ ) {while( s[now + 1].a <= q[i].a && now < maxn ) Add( s[++ now].id );result[q[i].id] = solve( q[i].n, q[i].m );}int mod = 1ll << 31;for( int i = 1;i <= Q;i ++ )printf( "%lld\n", result[i] % mod );return 0;
}

[国家集训队]Crash的数字表格/JZPTAB

  • solution
    一句话题意,求🍔∑i=1n∑j=1mlcm(i,j)\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)i=1nj=1mlcm(i,j)
  • step1:step1:step1: 枚举最大公因数

=∑d=1min(n,m)∑i=1n∑j=1mi×jd=\sum_{d=1}^{min(n,m)}\sum_{i=1}^n\sum_{j=1}^m\frac{i\times j}{d}=d=1min(n,m)i=1nj=1mdi×j

  • step2:step2:step2: 将最大公因数提到前面,循环上界压缩

=∑d=1min(n,m)∑i=1⌊nd⌋∑j=1⌊md⌋i×d×j×dd=∑d=1min(n,m)d∑i=1⌊nd⌋∑j=1⌊md⌋i×j[gcd(i,j)=1]=\sum_{d=1}^{min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\frac{i\times d\times j\times d}{d}=\sum_{d=1}^{min(n,m)}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i\times j\ \ \ \ \ \ \ \ \ \ [gcd(i,j)=1]=d=1min(n,m)i=1dnj=1dmdi×d×j×d=d=1min(n,m)di=1dnj=1dmi×j          [gcd(i,j)=1]

  • step3:step3:step3: 利用∑i∣nμ(i)=[n=1]\sum_{i|n}\mu(i)=[n=1]inμ(i)=[n=1],对原式不会造成改变

=∑d=1min(n,m)d∑i=1⌊nd⌋∑j=1⌊md⌋∑k∣gcd(i,j)μ(k)×i×j=\sum_{d=1}^{min(n,m)}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{k|gcd(i,j)}\mu(k)\times i\times j=d=1min(n,m)di=1dnj=1dmkgcd(i,j)μ(k)×i×j

  • step4:step4:step4: 也将μ\muμ提到前面,那么为了保证k∣i,k∣jk|i,k|jki,kj,枚举i,ji,ji,j变为直接枚举ki,kjki,kjki,kj

=∑d=1min(n,m)d∑kmin(⌊nd⌋,⌊md⌋)∑ki⌊nd⌋∑kj⌊md⌋μ(k)×k2×i×j=\sum_{d=1}^{min(n,m)}d\sum_{k}^{min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\sum_{ki}^{\lfloor\frac{n}{d}\rfloor}\sum_{kj}^{\lfloor\frac{m}{d}\rfloor}\mu(k)\times k^2\times i\times j=d=1min(n,m)dkmin(dn,dm)kidnkjdmμ(k)×k2×i×j

  • step5:step5:step5:kkk提出来

=∑d=1min(n,m)d∑kmin(⌊nd⌋,⌊md⌋)μ(k)×k2∑i=1⌊nd×k⌋∑j=1⌊md×k⌋i×j=\sum_{d=1}^{min(n,m)}d\sum_{k}^{min(\lfloor\frac{n}{d}\rfloor, \lfloor\frac{m}{d}\rfloor)}\mu(k)\times k^2\sum_{i=1}^{\lfloor\frac{n}{d\times k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d\times k}\rfloor}i\times j=d=1min(n,m)dkmin(dn,dm)μ(k)×k2i=1d×knj=1d×kmi×j
在这里插入图片描述

⚡:
∑kmin(⌊nd⌋,⌊md⌋)μ(k)×k2\sum_{k}^{min(\lfloor\frac{n}{d}\rfloor, \lfloor\frac{m}{d}\rfloor)}\mu(k)\times k^2kmin(dn,dm)μ(k)×k2使用老套路前缀和优化,之后O(1)O(1)O(1)查询
∑i=1⌊nd×k⌋∑j=1⌊md×k⌋i×j\sum_{i=1}^{\lfloor\frac{n}{d\times k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d\times k}\rfloor}i\times ji=1d×knj=1d×kmi×j其实就是一个等差数列求积

∑i=1n∑j=1mi×j=n×(n+1)2.m×(m+1)2\sum_{i=1}^n\sum_{j=1}^mi\times j=\frac{n\times (n+1)}{2}. \frac{m\times (m+1)}{2}i=1nj=1mi×j=2n×(n+1).2m×(m+1)

  • code
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define mod 20101009
#define maxn 10000005
int mu[maxn], prime[maxn], sum[maxn];
bool vis[maxn];
int cnt, inv;void init() {mu[1] = 1;for( int i = 2;i < maxn;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for( int i = 1;i < maxn;i ++ )sum[i] = ( sum[i - 1] + i % mod * i % mod * mu[i] % mod + mod ) % mod;
}int seq( int n ) {return n % mod * ( n + 1 ) % mod * inv % mod;
}int calc( int n, int m ) {if( n > m ) swap( n, m );int ans = 0, r;for( int i = 1;i <= n;i = r + 1 ) {r = min( n / ( n / i ), m / ( m / i ) );ans = ( ans + ( sum[r] - sum[i - 1] + mod ) % mod * seq( n / i ) % mod * seq( m / i ) % mod ) % mod;}return ans;
}int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}signed main() {init();inv = qkpow( 2, mod - 2 );int n, m;scanf( "%lld %lld", &n, &m );int ans = 0;for( int d = 1;d <= min( n, m );d ++ )ans = ( ans + d * calc( n / d, m / d ) % mod ) % mod;printf( "%lld\n", ans );return 0;
} 

[SDOI2015]约数个数和

  • solution
    一句话题意,设d(x)d(x)d(x)表示xxx的约数和,求🍔

∑i=1n∑j=1md(i×j)\sum_{i=1}^n\sum_{j=1}^md(i\times j)i=1nj=1md(i×j)

首先有一个约数和的公式🍔 我不是很会证
在这里插入图片描述
d(i×j)=∑x∣i∑y∣j[gcd(x,y)=1]d(i\times j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]d(i×j)=xiyj[gcd(x,y)=1]

=∑i=1n∑j=1m∑x∣i∑y∣j[gcd(x,y)=1]=\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]=i=1nj=1mxiyj[gcd(x,y)=1]
转换一下枚举方式,考虑直接枚举因子
=∑i=1n∑j=1m⌊ni⌋⌊mj⌋(gcd(i,j)=1)=\sum_{i=1}^n\sum_{j=1}^m\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{j}\rfloor\ \ (gcd(i,j)=1)=i=1nj=1minjm  (gcd(i,j)=1)
F(i)F(i)F(i)表示1≤x≤n,1≤y≤m,i∣gcd(x,y)1\le x\le n,1\le y\le m,i|gcd(x,y)1xn,1ym,igcd(x,y)的约数和
f(i)f(i)f(i)表示1≤x≤n,1≤y≤m,i=gcd(x,y)1\le x\le n,1\le y\le m,i=gcd(x,y)1xn,1ym,i=gcd(x,y)的约数和,f(1)f(1)f(1)即为最终答案
F(p)=∑p∣df(d),F(p)=∑i=1⌊np⌋∑j=1⌊mp⌋⌊ni∗p⌋⌊mj∗p⌋F(p)=\sum_{p|d}f(d),F(p)=\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\lfloor\frac{n}{i*p}\rfloor\lfloor\frac{m}{j*p}\rfloorF(p)=pdf(d),F(p)=i=1pnj=1pmipnjpm
莫比乌斯反演
f(p)=∑p∣tμ(tp)F(t)=∑p∣tμ(tp)∑i=1⌊nt⌋∑j=1⌊mt⌋⌊ni∗t⌋⌊mj∗t⌋f(p)=\sum_{p|t}\mu(\frac{t}{p})F(t)=\sum_{p|t}\mu(\frac{t}{p})\sum_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{t}\rfloor}\lfloor\frac{n}{i*t}\rfloor\lfloor\frac{m}{j*t}\rfloorf(p)=ptμ(pt)F(t)=ptμ(pt)i=1tnj=1tmitnjtm
最后想求的答案就是f(1)f(1)f(1)
=∑t=1min(n,m)μ(t)F(t),F(t)=∑i=1⌊nt⌋∑j=1⌊mt⌋⌊nit⌋⌊mjt⌋=\sum_{t=1}^{min(n,m)}\mu(t)F(t),F(t)=\sum_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{t}\rfloor}\lfloor\frac{n}{it}\rfloor\lfloor\frac{m}{jt}\rfloor=t=1min(n,m)μ(t)F(t),F(t)=i=1tnj=1tmitnjtm
在这里插入图片描述

对于求F(t)F(t)F(t)的方法,先计算出S(t)=∑i=1t⌊ti⌋S(t)=\sum_{i=1}^t\lfloor\frac{t}{i}\rfloorS(t)=i=1tit,则可以O(1)O(1)O(1)得到

  • code
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 50005
int T, n, m, cnt;
int mu[maxn], prime[maxn], sum[maxn];
bool vis[maxn];void init() {mu[1] = 1;for( int i = 2;i < maxn;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for( int i = 1;i < maxn;i ++ ) mu[i] += mu[i - 1];for( int x = 1;x < maxn;x ++ ) {int ans = 0;for( int i = 1, j;i <= x;i = j + 1 ) {j = x / ( x / i );ans += ( j - i + 1 ) * ( x / i );}sum[x] = ans;}
}int calc( int n, int m ) {if( n > m ) swap( n, m );int ans = 0, r;for( int i = 1;i <= n;i = r + 1 ) {r = min( n / ( n / i ), m / ( m / i ) );ans += ( mu[r] - mu[i - 1] ) * sum[n / i] * sum[m / i];}return ans;
}signed main() {init();scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &m );printf( "%lld\n", calc( n, m ) );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P7293-[USACO21JAN]Sum of Distances P【统计,bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7293 题目大意 有kkk张联通无向图&#xff0c;有kkk个人从每张图的点111出发&#xff0c;定义所有人的位置合为一个状态&#xff0c;求初始状态到达所有能到达状态的最短时间的和。 输出答案对 109710^971097 取模。 ∑n≤…

模板:次短路

所谓次短路&#xff0c;就是又次又短的路 &#xff08;逃&#xff09; 解析 使用两遍swap是更新sec的好方法 一定要判断是严格次短才更新sec的答案&#xff01; 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline const int …

平面切分

平面切分 问题描述 题解&#xff1a; 我对这种题极其非常不擅长。。。 另外吐槽为什么acwing的数据卡的这么死&#xff0c;蓝桥杯官网数据那么水 其实题目很简单&#xff0c;如果只有一个直线&#xff0c;那么就是两部分&#xff0c;如果是两个直线&#xff0c;这两个直线不相…

新起点!新征程!微软技术俱乐部(苏州)成立大会暨微软技术交流会

2019年1月19日&#xff0c;苏州微软将举办苏州史上最盛大的开发者聚会&#xff0c;微软技术俱乐部成立大会暨微软技术交流会。超越苹果&#xff0c;登顶世界市值第一&#xff01;云与AI两大技术支柱支撑起的微软帝国&#xff0c;正向万亿美元俱乐部挺进&#xff01;微软的改变我…

P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地&#xff0c;每个草地有不同收益&#xff0c;mmm个点是地方的点&#xff0c;现在你要放置nnn个我方的点&#xff0c;不能和敌方的点重合。 如果一个草地离最近的我方的点距离严格小于最…

模板:整除分块

所谓整除分块&#xff0c;就是按照整除的结果分块 &#xff08;逃&#xff09; 解析 一个关键的结论&#xff1a; 对于 i≤ni\le ni≤n&#xff0c;满足 ⌊nx⌋⌊ni⌋\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{n}{i}\rfloor⌊xn​⌋⌊in​⌋ 的最大的 xxx 为 ⌊n⌊ni⌋⌋\lfl…

[Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

文章目录titlesolutioncodetitle solution 一棵nnn个点的树有n−1n-1n−1条边。 一般的&#xff0c;对于森林而言则有点数-边数树的个数 那么我们将无向图随便生成一个生成树&#xff0c;形成森林。 询问的连通块的个数就变为求森林的树的个数&#xff0c;即森林的点数 n …

跨平台、跨语言应用开发工具,Elements 介绍

目录1&#xff0c;Elements 介绍2&#xff0c;Elements 版本3&#xff0c;Elements 能干嘛4&#xff0c;Elements IDES5&#xff0c;Elements 工具1&#xff0c;Elements 介绍RemObjects Elements&#xff0c;是多平台移动项目开发工具&#xff0c;是一款可以帮助开发人员在 不…

蓝桥杯--字串排序

题目&#xff1a; 小蓝的幸运数字是 &#xff0c;他想找到一个只包含小写英文字母的字符串&#xff0c;对这个串中的字符进行冒泡排序&#xff0c;正好需要 V次交换。请帮助小蓝找一个这样的字符串。如果可能找到多个&#xff0c;请告诉小蓝最短的那个。如果最短的仍然有多个&…

P4688-[Ynoi2016]掉进兔子洞【莫队,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P4688 题目大意 给出一个长度为nnn的序列aaa。 然后mmm次询问给出三个区间&#xff0c;求这三个区间构成的可重集删去交集后剩下的数字个数和。 1≤n,m≤105,1≤ai≤1091\leq n,m\leq 10^5,1\leq a_i\leq 10^91≤n,m≤105,1…

洛谷P3791:普通数学题(整除分块、前缀和)

解析 似乎位运算和易或并没有太多性质上的联系… 所以换个角度分析 考虑按照二进制进行类似数位dp 暴力枚举 i 和 j 的前k,p位与n、m相同&#xff0c;下一位比n、m小。 然后后面的东西就可以随便填 每个异或的结果都有2^(两个数都可以随便填的位数)的方案 然后乘上一个约数个…

后缀自动机(SAM)构造实现过程演示+习题集锦

文章目录后缀自动机算法实现过程模板习题洛谷后缀自动机模板题品酒大会[HEOI2015]最短不公共子串字符串蒟蒻写这篇blogblogblog主要是存一下&#xff0c;后缀自动机的详细搭建过程&#xff0c;方便以后复习 具体的某些证明&#xff0c;为什么这么做&#xff0c;正确性劈里啪啦一…

使用logdashboard进行可视化的日志追踪

本文源码在Github可以找到下载LogDashboard如果你还不了解LogDashboard请看这里。 LogDashboard 1.1版本支持请求追踪,虽然目前版本还没有发布。不过这个功能可以先睹为快效果图下载项目首先我们可以在 https://github.com/liangshiw/LogDashboard/tree/master/samples/Request…

ARC132D-Between Two Binary Strings【贪心】

正题 题目链接:https://atcoder.jp/contests/arc132/tasks/arc132_d 题目大意 给出两个恰好有nnn个111和mmm个000的字符串s,ts,ts,t&#xff0c;定义两个字符串距离为通过交换两个相邻的字符把一个变成另一个的最小步数。 对于字符串kkk如果dis(s,k)dis(k,t)dis(s,t)dis(s,k…

CodeCraft-21 and Codeforces Round #711 (Div. 2)

CodeCraft-21 and Codeforces Round #711 (Div. 2) 题号题目考点AGCD Sum签到&#xff0c;模拟BBox Fitting贪心CPlanar Reflections规律暴力&#xff08;直接乱搞就对了&#xff09;DBananas in a Microwave思维题&#xff0c;贪心ETwo Houses交互题&#xff08;未补&#xf…

模板:插头DP

所谓插头dp&#xff0c;就是使用插头的dp &#xff08;逃&#xff09; 解析 好难呀qwq 终于算是学明白了吧 推荐博客 字太多了不想打了 自己过去看吧 感觉写的非常清晰了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline …

【C#与Redis】--C# 操作 Redis

一、简介 C# 中通过 StackExchange.Redis 库可以方便地操作 Redis&#xff0c;实现高性能的数据缓存和存储。StackExchange.Redis 提供了强大的 API&#xff0c;允许开发者轻松连接、读取和写入 Redis 数据。通过使用 ConnectionMultiplexer 类&#xff0c;可以建立与 Redis 服…

ML.NET 0.9特性简介

ML.NET 0.9已于上周发布&#xff0c;距离上次0.8版本的发布只有一个多月&#xff0c;此次增加的新特性主要包括特征贡献计算&#xff0c;模型可解释性增强&#xff0c;ONNX转换对GPU的支持&#xff0c;Visual Studio ML.NET项目模板预览&#xff0c;以及API改进。特征贡献计算特…

[学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛

筛积性函数的前缀和常见积性函数公式推导狄利克雷卷积杜教筛实现常见卷积习题集Sum神犇和蒟蒻简单的数学题常见积性函数 μ\muμφφφd(n)d(n)d(n)&#xff1a;nnn的约数个数σ(n)σ(n)σ(n)&#xff1a;nnn的约数和ϵ(n)ϵ(n)ϵ(n)&#xff1a;单位元函数&#xff0c;e(n)[n1…

51nod-动物与游戏【树链剖分,线段树】

正题 题目链接:http://www.51nod.com/Contest/Problem.html#contestProblemId3957 题目大意 nnn个点的一棵树&#xff0c;第iii个节点上的动物有ai100\frac{a_i}{100}100ai​​的概率加入&#xff0c;每个加入的动物都会每秒向父节点移动。 对于第iii只动物&#xff0c;如果它…