首页 > 其他分享 >Algorithm 2 - 一些数论/组合计数知识

Algorithm 2 - 一些数论/组合计数知识

时间:2022-12-31 13:33:10浏览次数:60  
标签:varepsilon 函数 Algorithm 数论 mu 计数 seed 积性 性质

0. 一些前置知识

  1. 莫比乌斯函数:定义 \(\mu(x)\) 为:当 \(x\) 含平方因子,则 \(\mu(x) = 0\);否则设其有 \(p\) 个质因子,\(\mu(x)=(-1)^p\)。

特别的,\(\mu(1)=1\)。

  1. 莫比乌斯函数的性质:\(\sum \limits_{d | x} \mu(x) = \varepsilon(x)\)
  2. 欧拉函数更牛逼的性质:\(\sum \limits_{d | x} \varphi(x) = x\)

1. 狄利克雷卷积

1.1 性质

定义两个数论函数的卷积为 \(f * g\)。

性质 1:\(f * g = g * f\);\(( f * g ) * h = f * (g * h)\);\((f+g)*h = f*h + g*h\)。

性质 2: \(\varepsilon * f = f\) (由此可以知道 \(\varepsilon\) 为单位元,然后可以定义函数的逆 \(f * f^{-1} = \varepsilon\)。

性质 3:若 \(f(1) \ne 0\),则 \(f\) 存在逆元。

这个在多项式里面也有提到,就是说可以通过递推构造的形式产生 \(f^{-1}\)。上述命题显然。

性质 4

有两个积性函数 \(f,g\)。

那么 \(f * g\) 为积性函数,\(f^{-1}\) 为积性函数。

1.2 狄利克雷前缀和

我们要求的是 \(f * 1\)。

根据 SOSDP 的思想,可以枚举每一个质数,进行 SOSDP。时间复杂度 \(O(n \ln \ln n)\)。

例题 1P5495 Dirichlet 前缀和

模板题,代码如下。

#define uint unsigned int
uint seed;
inline uint getnext(){
	seed^=seed<<13;
	seed^=seed>>17;
	seed^=seed<<5;
	return seed;
}
bool vis[20000005];
ll cnt, prim[20000005];
void init(){
    for(ll i=2;i<=2e7;i++){
        if(!vis[i]) prim[++cnt]=i;
        for(ll j=1;j<=cnt && i*prim[j]<=2e7;j++){
            vis[i*prim[j]]=1;
            if(i%prim[j]==0) continue;
        }
    }
}
ll n,a[20000005];
void solve(){
    n=read(); seed=read();
    for(ll i=1;i<=n;i++)
        a[i]=getnext();
    for(ll i=1;i<=cnt;i++){
        for(ll j=1;j<=n/prim[i];j++){
            a[j*prim[i]]+=a[j];
        }
    }
    ll ans=0;
    for(ll i=1;i<=n;i++) ans^=a[i];
    cout<<ans<<endl;
    return;
}

标签:varepsilon,函数,Algorithm,数论,mu,计数,seed,积性,性质
From: https://www.cnblogs.com/BreakPlus/p/17016499.html

相关文章