欧拉函数和线性筛法:AcWing 874. 筛法求欧拉函数

这篇具有很好参考价值的文章主要介绍了欧拉函数和线性筛法:AcWing 874. 筛法求欧拉函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1e6+10;
int primes[N],cnt;
int euler[N];
bool state[N];

void get_euler(int n)
{
    euler[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!state[i])
        {
            primes[cnt++]=i;
            euler[i]=i-1;
        }
        for(int j=0;primes[j]<=n/i;j++)
        {
            int t=primes[j]*i;
            state[t]=true;
            if(i%primes[j]==0)
            {
                euler[t]=euler[i]*primes[j];
                break;
            }
            euler[t]=euler[i]*(primes[j]-1);
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    get_euler(n);
    LL ans=0;
    for(int i=1;i<=n;i++)   ans+=euler[i];
    printf("%lld\n",ans);
    return 0;
}

1.属于是先手推数学式子,然后代码比较简单的题目

2. 线性筛法,之前接触过一道类似的线性筛法的题目:线性筛法

3.线性筛法是一个算法模板

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+10;
bool state[N];
int primes[N],cnt;

void euler(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!state[i])
        {
            primes[cnt++]=i;
        }
        for(int j=0;primes[j]<=n/i;j++)
        {
            int t=primes[j]*i;
            state[t]=true;
            if(i%primes[j]==0) break;
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    euler(n);
    printf("%d\n",cnt);
    return 0;
}

顺便写一下这一道题目的笔记:AcWing 868. 筛质数

4. 下面详细分析一下线性筛法之外的数学部分的内容

5.从1一直到某一个质因子的欧拉函数的数值是质因子-1,这是第一种情况

6.第二种情况,primes[j]是i的一个质因子,根据欧拉函数公式,

euler[i]=i*(1-1/p1)*(1-1/p2)*...*(1-1/pk);
euler[i*primes[j]]=(i*primes[j])*(1-1/p1)*(1-1/p2)*...*(1-1/pk);

因为primes[j]是某一个质因子,所以后面部分是一样的,上面下面相互对照,可以得到,

euler[t]=euler[i]*primes[j];

7.第三种情况,primes[j]不是i的质因子,

euler[i]=i*(1-1/p1)*(1-1/p2)*...(1-1/pk);
euler[i*primes[j]]=(i*primes[j])*(1-1/p1)*(1-1/p2)*..*(1-1/primes[j]);
euler[i*primes[j]]=i*(1-1/p2)*...(1-1/pk)*(primes[j]-1);
//把第二行式子最后面的括号通分,和最前面的primes[j]约掉,得到第三行的式子
//再把第一行的式子和第三行的式子进行对照

可以得到

           euler[t]=euler[i]*(primes[j]-1);

(自己可以推导出来的数学式子也很有趣呢())

8.break是直接跳出循环,不只是跳出if的条件判断

9.以上就是这个题目的全部内容,没有比当傻瓜更简单的事儿了,为了一件事情疯狂,总有一天可以从中找到答案。 

 文章来源地址https://www.toymoban.com/news/detail-718275.html

 

 

到了这里,关于欧拉函数和线性筛法:AcWing 874. 筛法求欧拉函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛

    竞赛 - AcWing 3694. A还是B - AcWing题库 简单题 3695. 扩充序列 - AcWing题库 考查递归。可以发现最终序列除中点,左右两段都是相等的,可以依据这个特性来递归 超级长的序列缩小 (log_2n) 次,每次将 k 坐标映射到缩小的各个序列上,k肯定是其中一个序列的中点 3696. 构造有向无环

    2024年02月09日
    浏览(39)
  • C++ 算法竞赛、01 周赛篇 | AcWing 第1场周赛

    竞赛 - AcWing 3577. 选择数字 - AcWing题库 暴力两层循环 两个数组的最大值相加一定是新数 3578. 最大中位数 - AcWing题库 整数二分问题。求中位数,并依次递增,计算所需的操作次数。求最后一个操作次数总和 = k 的中位数值 如果 mid - a[i] 0 ,意味着该数比中位数大, 不需要操作

    2024年02月10日
    浏览(47)
  • C++ 算法竞赛、06 周赛篇 | AcWing 第97场周赛

    4944. 热身计算 - AcWing题库 4944. 热身计算 - AcWing题库 4945. 比大小 - AcWing题库 考查K进制转换十进制 4946. 叶子节点 - AcWing题库 无向边要开两倍点数的数组,见常量 M cnt 统计每个有效叶子节点的个数 st 记录遍历过的点,让每个点只遍历一次 dfs count 统计还有几条边没走,0 条则为

    2024年02月09日
    浏览(38)
  • C++ 算法竞赛、04 周赛篇 | AcWing 第5场周赛

    竞赛 - AcWing 3726. 调整数组 - AcWing题库 简单题,判断奇偶数是否同时存在 3727. 乘方相加 - AcWing题库 记录 每个数据 的 k 进制 各个位数的值 保存到数组,题目要求每位最多为 1,超过 1 则无法达到 3728. 城市通电 - AcWing题库 图是稠密图,用朴素版Prim求, (O(n^2)) 每点建立发电站

    2024年02月09日
    浏览(71)
  • C++ 算法竞赛、05 周赛篇 | AcWing 第85场周赛

    竞赛 - AcWing 4791. 死或生 - AcWing题库 简单题 4792. 最大价值 - AcWing题库 贪心,先找到最大价值的字母,往最后面插最大的 4793. 危险程度 - AcWing题库 把图分成若干个连通块,每个连通块假设有 k 个点,最多会反应 k - 1 次 因此题目转变为求连通块数量,假设为 t,答案就是 (2^

    2024年02月09日
    浏览(42)
  • 湘大 XTU OJ 1345 素数字符串 题解:欧拉筛法 前缀和 ‘\0‘ sprintf

    素数字符串 我们将素数从小到大依次书写,可以得到一个字符串\\\"23571113⋯\\\",已知一个数码d(0≤d≤9),求字符串在区间[L,R]之间的多少个d? 第一行是一个整数T(1≤T≤10000),表示样例的个数。 每个样例是一行, 为3个整数,区间L,R,(1≤L≤R≤1000000)和数码d。 区间从1开始计数。 每

    2024年02月12日
    浏览(37)
  • 筛法--朴素筛法和埃式筛法和线性筛法

    朴素筛法:  这个朴素算法的 思路 就是,枚举这些数,首先在st数组初始化时,就是已经把这个数组内的值都初始化为0,也就是说都是看成是质数。。。。 然后,如果这个数确实是质数,那么我们就可以把这个数放入我们存质数的数组里面去,然后对质数的个数进行增加,

    2024年02月07日
    浏览(59)
  • acwing算法基础之动态规划--线性DP和区间DP

    线性DP:状态转移表达式存在明显的线性关系。 区间DP:与顺序有关,状态与区间有关。 题目1 :数字三角形。 解题思路:直接DP即可, f[i][j] 可以来自 f[i-1][j] + a[i][j] 和 f[i-1][j-1] + a[i][j] ,注意 f[i-1][j] 不存在的情况(最后一个点)和 f[i-1][j-1] 不存在的情况(第一个点)。

    2024年02月04日
    浏览(52)
  • 线性筛法 O(n)

      线性筛O(n)而埃氏筛进行筛时会重复筛,线性筛不会出现这个问题 线性筛:对于某个合数使用其最小质因子筛去 st[primes[j] * i] = true;  因为这句话只会被执行一次,所以复杂度O(fn)  

    2023年04月09日
    浏览(99)
  • [数论第二节]欧拉函数/快速幂/扩展欧几里得算法

    欧拉函数 (varphi(N)) : 1-N中与N互质的数的个数 若 (N = p_1^{a_1} · p_2^{a_2} · p_3^{a_3} ··· ·p_n^{a_n}) 其中p为N的所有质因子 则 (varphi(N) = N(1-frac{1}{p_1})(1-frac{1}{p_2})···(1-frac{1}{p_n})) 证明: 互质:两数的公共因子只有1 去掉所有与N有(大于1的)公共因子的数,剩下的数就是与

    2024年02月14日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包