首页 > 其他分享 >欧拉函数的power

欧拉函数的power

时间:2022-10-04 20:55:39浏览次数:56  
标签:phi frac 函数 power int pri include 欧拉

在算数基本定理中有 $ N = p_{1}^{a1} p_{2}^{a2} p_{3}^{a3} ..... p_{k}^{ak} $
wuw在y总的课中是用了容斥原理进行推导


得到了
$ \phi(x) = N * (1 - \frac{1}{p1}) * (1 - \frac{1}{p2}) * .... * ( 1 - \frac{1}{pk}) $
所以就可以得到依靠该公式得出的欧拉公式的算法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
int n;
//f(x) = x(1 - 1/p1)(1-1/p2)...(1-1/pk);
int main()
{
    cin >> n;
    while (n -- ){
        vector<int> res;
        int x;
        cin >> x;int c = x;
        for(int i = 2; i <= x / i; i ++)
        {
            if(x%i == 0){
                while(x % i == 0)
                {
                    x /= i;
                }
                res.push_back(i);
            }
        }
        if(x > 1)
            res.push_back(x);
        
        for(auto t: res)
        {
         //   cout << t << ' ';
            c = c - c / t;
        }
        cout << c << endl;
    }
    return 0;
}

but 这样做因为存在着分解质因数的时间复杂度为 \(O(\sqrt{a})\)
加上要进行n次所以最后的时间复杂度是 \(O(\sqrt{a}* n)\)
所以可以引进之前学习的线性筛(欧拉筛)
设数组phi[N]表示 \(\phi(x)\)
因为 数组pri是记录质数的存在 1~pri[i]与pri[i]互质的数的个数一定是 pri[i] - 1所以phi[pri[i] = pri[i] - 1
所以在质数筛过程中进行的 st[pri[j] * i]操作时就可以有两种情况
当 i % pri[j] == 0时
这个时候 pri[j] 和 i 的 因子是相同的所以$ \phi(i) $ 和 \(\phi(pri[j] * i)\) 仅仅是后者多乘了一个 pri[j] 就有phi[i * pri[j]] = pri[j] * phi[i];
另一种情况时
此时因子不同 要在乘一个(1 - \(\frac{1}{pri[j]}\)) 和 pri[j]所以就有 phi[i * pri[j]] = phi[i] * (pri[j] - 1);

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e6 + 10;
bool st[N];
int pri[N],cnt;
int phi[N];
int main()
{
    int n;
    cin >> n;
    for(int i = 2; i <= n; i ++)
    {
        if(!st[i])
        {
            pri[cnt ++] = i;
            phi[i] = i - 1;
        }
        for(int j = 0; pri[j] <= n / i; j ++)
        {
            st[pri[j] * i] =true;
            if(i % pri[j] == 0)
            {
                phi[i * pri[j]] = pri[j] * phi[i];
                break;
            }
            phi[i * pri[j]] = phi[i] * (pri[j] - 1);
        }
    }
    phi[1] = 1;
    long long sum = 0;
    for(int i = 1; i <= n; i ++)
        sum += phi[i];//cout << phi[i] << ' ';
    cout << sum;
    return 0;
}

可以做到时间复杂度为 $ O(n) $

标签:phi,frac,函数,power,int,pri,include,欧拉
From: https://www.cnblogs.com/zzzlym99yyds/p/16754444.html

相关文章

  • Occupancy Networks:基于学习函数空间的三维重建表示方法
    概述 随着深度神经网络的到来,基于学习的三维重建方法逐渐变得流行。但是和图像不同的是,在3D中没有规范的表示,既能高效地进行计算,又能有效地存储,同时还能表示任意拓扑的高分......
  • 达梦数据库-日期类型常用函数汇总
    日期时间函数的参数至少有一个是日期时间类型(TIME,DATE,TIMESTAMP),返回值一般为日期时间类型和数值类型。由于DM支持儒略历,并考虑了历史上从儒略历转换至格里高利日期时的......
  • 2、solidity数据类型以及函数
    solidity数据类型分为以下几种:1、整型int(有符号整型,有正有负)uint(无符号整型,无负数)以8位为区间,支持int8,int16,int24至int256,uint同理。int默认为int256,uint......
  • 函数
    函数概念及常见函数1.函数概念定义如果对于每个数\(x\inD\),变量\(y\)按照一定的法则总有一个确定的\(y\)和它对应,则称\(x\)是\(y\)的函数,记为\(y......
  • 多元函数的极限、连续与微分1
    $1.求极限:(1)\lim_{(x,y)\to(0,0)}(1+x^2+y^2)^{\frac{xy}{x^2+y^2}}(2)\lim_{x\to\infty,y\to\infty}\frac{x+y}{x^2-xy+y^2}$\((1)\)\[\lim_{(x,y)\to(0,0)}......
  • selenium 函数汇总
    目录截图滚动条相关操作判断状态获取网页相关数据浏览器操作元素操作截图截某个元素的图ele=driver.find_element(By.XPATH,"//div[@class='alertalert-successale......
  • __builtin_expect函数
    一、背景在很多源码如Linux内核、Glib等,我们都能看到likely()和unlikely()这两个宏,通常定义如下#definelikely(x)__builtin_expect(!!(x),1)#defineunlikely(x)......
  • 关于python函数中带*星号参数-收集参数的使用说明
    在python中,定时函数时,一般就得确定函数的参数的个数当然函数可以没有参数,也可以指定明确的形式参数的个数,那样在调用这个函数时,实参的个数就需要与形参个数一致defPrin......
  • 函数传参的细节
         ......
  • 函数的递归调用
    介绍:一个函数在函数体内又调用了本身,称之为递归调用例子:  ①当在函数main内调用test(4)时,执行判断if,由于4>2,执行test(n-1),此时n=4,则传值为test(3)②继续执行判断if......