首页 > 其他分享 >欧拉筛素数及积性函数

欧拉筛素数及积性函数

时间:2022-09-03 01:11:05浏览次数:61  
标签:Prime 函数 积性 int 素数 mv 欧拉

欧拉筛素数及积性函数

欧拉筛素数

int Prime[N], tot;
bool Not[N];//true 则 i 不是素数
void GetPrime(const int& n = N - 1) {
    Not[1] = true;
    for (int i = 2; i <= n; ++i) {
        if (!Not[i]) Prime[++tot] = i;
        for (int j = 1; j <= tot && i * Prime[j] <= n; ++j) {
            Not[i * Prime[j]] = true;
            if (i % Prime[j] == 0) break;
        }
    }
}

常见的积性函数

/*
 *@  Prime[i]   : 第i个素数
 *@  mv[i]      : i的最小质因子
 *@  f[i]       : 积性函数
质数的最小质因子为它本身
*/
int Prime[N], mv[N], tot;
void GetPrime(const int& n = N - 1) {
    // f[1]=1;
    for (int i = 2; i <= n; ++i) {
        if (!mv[i]) {
            Prime[++tot] = i;
            mv[i] = i;
            // f[i]=...;
        }
        for (int j = 1; j <= tot && i * Prime[j] <= n; ++j) {
            mv[i * Prime[j]] = Prime[j];
            if (i % Prime[j] == 0) {
                // f[Prime[j]*i]=...;
                break;
            }
            //f[i * Prime[j]] = f[i] * f[Prime[j]];
        }
    }
}

常见的积性函数全家桶

/*
 *@ Prime[i]     :第i个素数
 *@ mv[i]        :i的最小质因子(判断是否为素数)
 *@ sigma0[i]    :i的约数个数和
 *@ sigma1[i]    :i的约数的和
 *@ phi[i]       :欧拉函数[1,i]中与i互质的数的个数
 *@ mobius[i]    :i的莫比乌斯函数
 */
constexpr int M = static_cast<int>(1e7 + 5);
int Prime[M], sigma0[M], sigma1[M], mv[M], mobius[M], phi[M], tot;
void GetPrimeAll(const int& n = M - 1) {
    sigma0[1] = sigma1[1] = phi[1] = mobius[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (!mv[i]) {
            Prime[++tot] = i;
            mv[i] = i;
            sigma0[i] = 2;
            sigma1[i] = i + 1;
            phi[i] = i - 1;
            mobius[i] = -1;
        }
        for (int j = 1; j <= tot && i * Prime[j] <= n; ++j) {
            mv[i * Prime[j]] = Prime[j];
            if (i % Prime[j] == 0) {
                sigma0[i * Prime[j]] = sigma0[i] * 2 - sigma0[i / Prime[j]];
                sigma1[i * Prime[j]] = sigma1[i] * (Prime[j] + 1) - Prime[j] * sigma1[i / Prime[j]];
                phi[i * Prime[j]] = phi[i] * Prime[j];
                mobius[i * Prime[j]] = 0;
                break;
            }
            sigma0[i * Prime[j]] = sigma0[i] * sigma0[Prime[j]];
            sigma1[i * Prime[j]] = sigma1[i] * sigma1[Prime[j]];
            phi[i * Prime[j]] = phi[i] * phi[Prime[j]];
            mobius[i * Prime[j]] = mobius[i] * mobius[Prime[j]];
        }
    }
}

普遍的积性函数

/*
 *@  Prime[i]   : 第i个素数
 *@  low[i]   : i的最小质因子的幂次值
 *@  mv[i]     : i的最小质因子
 *@  f[i]       : 积性函数
质数的最小质因子是它本身,即mv[i]=i
*/
int Prime[N], mv[N], low[N], tot = 0;
long long f[N];
void GetPrime(const int& n = N - 1) {
    f[1] = low[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (!mv[i]) mv[i] = i, Prime[++tot] = i, low[i] = i, f[i] = /*do something*/;  //质数处理
        for (int j = 1; j <= tot && i * Prime[j] <= n; ++j) {
            mv[i * Prime[j]] = Prime[j];
            if (i % Prime[j] == 0) {
                low[i * Prime[j]] = low[i] * Prime[j];
                f[i * Prime[j]] = low[i] == i ? /*do something*/ : f[i / low[i]] * f[low[i] * Prime[j]];
                //递推处理(找规律)
                break;
            }
            low[i * Prime[j]] = Prime[j];
            f[i * Prime[j]] = f[i] * f[Prime[j]];
        }
    }
}

标签:Prime,函数,积性,int,素数,mv,欧拉
From: https://www.cnblogs.com/Cattle-Horse/p/16651805.html

相关文章

  • 欧拉反演与它的证明
    就是证明,用狄利克雷卷积做,欧拉反演狗都不用/oh\(\sum\limits_{d|n}\varphi(d)=n\)。长得很像狄利克雷卷积,令\(g(n)\)恒等于\(1\),作\(\varphi(n)\)与\(g(n)\)的......
  • 欧拉路径
    https://www.acwing.com/problem/content/1621///欧拉图:连通&&所有点的度数为偶//半欧拉图:连通&&只有2个点的度数为奇其余度数为偶//非欧拉图:else#include<iost......
  • 素数相关
    欧拉筛法用数组v[i]来记录这个数的最小质因子依次考虑2-n这些数如果v[i]=i,表示这个数为素数,把这个数存起来否则,扫描所有小于等于v[i]的素数,令v[ip]=p,表示ip这个......
  • 性感素数
    题目描述"性感素数"是指形如(p,p+6)这样的一对素数。之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。现给定一个整数,请你判断其是否为一个性感素数......
  • 【luogu P2508】圆上的整点(高斯素数模板)
    圆上的整点题目链接:luoguP2508题目大意给你一个圆,问你圆周上有多少个点的坐标是整点。思路考虑一个东西叫做高斯整数。其实它是复数,是\(a+bi\)中\(a,b\)都是整......
  • 欧拉计划
    \(\texttt{Problem1}\)\(\texttt{Describe}\)在小于\(10\)的自然数中,\(3\)或\(5\)的倍数有\(3,5,6\)和\(9\),这些数之和是\(23\)。求小于\(1000\)的自然数中......
  • 欧拉函数
    1欧拉函数定义在数论中,对正整数n,欧拉函数φ(n)是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)或是欧拉总计函数(to......
  • 欧拉函数
    欧拉函数acwing873.欧拉函数定义欧拉函数phi(n)表示1~n中互质的数的个数(若n为质数,这phi(n)=n-1)欧拉函数公式已知则欧拉函数的公式:\[\varphi(n)=N(1-\frac{1......
  • 欧拉路径学习笔记
    \(\bigstar\)欧拉路径若\(G=(V,\E)\)中的一条路径包含了\(E\)中的所有边且不重复,则称其为欧拉路径(\(\textbf{EulerianPath}\))。若该路径的起点与终点相同,则称其......
  • Atcoder Grand Contest 025 E - Walking on a Tree(欧拉回路)
    Atcoder题面传送门打个表发现答案等于每条边被覆盖的次数与\(2\)取min之和,考虑如何构造这个上界。首先考虑树是以\(1\)为中心的菊花图,且任意\(A_i,B_i\ne1\)的......