基本定理:

首先看一下核心代码:

核心代码

原理解析:

当初我看不懂这段代码,主要有这么几个问题:

1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n?

2.ans不是*(prime[i]-1)么?为什么到了第二个while循环变成*prime[i]了?

3.定理里面不是要/pi么?为什么代码里没有/pi?????????????

公式化简

首先我们来分析一下整个程序的原理,如果把程序的原理搞明白了,这三个问题也就自然而然的解决了

这个程序的原理是基于唯一分解定理:

那么我们可以把n拆开,再带回到欧拉函数公式中,然后再约分一下:

LaTex代码:

 ans=p_1^a^*p_2^a^*.......*p_i^a^i*\frac{p_1-}{p_1}*\frac{p_2-}{p_2}*....*\frac{p_i-}{p_i}
\newline
=p_1^a^*\frac{p_1-}{p_1}*.......*p_2^a^*\frac{p_2-}{p_2}*....p_i^a^i*\frac{p_i-}{p_i}
\newline
=p_1^a^{-}*({p_1-})*.......*p_2^a^{-}*({p_2-})*....p_i^a^{i-}*({p_i-})

解答问题

首先这里的代码实现还有一个小技巧:
我们在while之前把x/prime[i],这就相当于让ans少*一个prime[i],这样就可以解决求指数ai-1的问题了

现在再回去看一下刚开始的三个问题,仔细想一想

提示:

下面有答案,

但请认真思考以后再看,

答案在下面:

1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n?

因为n被唯一分解了,while循环里面的内容就是用来*n的

2.ans不是*(prime[i]-1)么?为什么到了第二个while循环变成*prime[i]了?

*prime是为了让答案最终*n

3.定理里面不是要/pi么?为什么代码里没有/pi?????????????

被化简了,不明白的可以看上面的化简过程

完整代码

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=;
int prime[MAXN];
int mu[MAXN]= {,};
int n;
int tot=;
int vis[MAXN]= {,};
void read(int &n) {
char c='+';
int x=;
bool flag=;
while(c<''||c>'') {
c=getchar();
if(c=='-')flag=;
}
while(c>=''&&c<='') {
x=x*+c-;
c=getchar();
}
flag==?n=-x:n=x;
}
void ou() {
for(int i=; i<=n; i++) {
if(!vis[i])
prime[++tot]=i,mu[i]=-;
for(int j=; j<=tot&&j*prime[i]<=n; j++) {
vis[i*prime[j]]=;
if((i%prime[j])==) {
mu[i*prime[j]]=;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
int getphi(int x) {
int ans=;
for(int i=; i<=tot&&prime[i]*prime[i]<=x; i++)
{
if(x%prime[i]==)
{
ans*=(prime[i]-);
x=x/prime[i];
while(x%prime[i]==)
{
ans*=prime[i];
x/=prime[i];
}
} }
if(x>)
ans*=x-;
return ans;
}
int main() {
n=;
ou();
int c;
printf("please input the num\n");
while(cin>>c)
printf("the num`s phi is %d\n",getphi(c));
return ; }

里面还乱入了线性求莫比乌斯函数的方法,,

懒得删了,,,

结尾啰嗦几句

求单值欧拉函数就讲到这里,

其实对于这份代码还有一种很玄学的理解方法,

但是我的这种方法比较简单易懂,

而且这两种理解方法从本质上来说是一样的

这里不在赘述

最后再说一下,这里只介绍了求单值欧拉函数的方法,

实际上欧拉函数还有线性筛法(因为欧拉函数是积性函数)

有空再介绍吧

另外,因为本人是第一次接触欧拉函数,所以本文肯定有成堆的bug,如果您找出了bug,可以在评论区留言或者通过其他方式联系本人,

谢谢!

√n求单值欧拉函数的更多相关文章

  1. 求逆欧拉函数(arc)

    已知欧拉函数计算公式 初始公式:φ(n)=n*(1-1/p1)*(1-1/p2).....*(1-1/pm)   又 n=p1^a1*p2^a2*...*ps^as  欧拉函数是积性函数 那么:φ(n ...

  2. O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

    筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1, ...

  3. (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)

    题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  4. POJ 2480 (约数+欧拉函数)

    题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...

  5. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  6. hdu 2824 The Euler function(欧拉函数)

    题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...

  7. UVA 10214 Trees in a Wood(欧拉函数)

    题意:给你a.b(a<=2000,b<=2000000),问你从原点可以看到范围在(-a<=x<=a,-b<=y<=b)内整数点的个数 题解:首先只需要计算第一象限 ...

  8. 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)

    P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...

  9. A - Bi-shoe and Phi-shoe 欧拉函数

    /** 题目:A - Bi-shoe and Phi-shoe 链接:https://vjudge.net/contest/154246#problem/A 题意:每一个数都有一个得分,它的得分就是, ...

随机推荐

  1. docker中gitlab-runner配置

    1.启动gitlab-runner docker run -d --name gitlab-runner --restart always \ -v /opt/data/gitlab-runner/c ...

  2. Thinking in Java Chapter 14

    From Thinking in Java 4th Edition RTTI(Run-Time Type Information),运行时类型信息,使得你可以在程序运行时发现和使用类型信息.对RTTI ...

  3. web开发之菜鸟的代码规范

    笔者菜鸟里最不会飞的那个,所以这些基础的习惯都没养成,正好抽时间特意做个笔记以方便自己规范代码, 有兴趣的大佬多多指点. 养成好的编码习惯收益良多, 总结下编码时应注意的细节<借鉴高程里代码约束 ...

  4. KNN算法简介

    KNN算法 K-近邻算法原理 K最近邻(kNN,k-NearestNeighbor)分类算法,见名思意. 我们的目的是要预测某个学生在数学课上的成绩... 先来说明几个基本概念:图中每个点代表一个样本 ...

  5. mysql快熟入门

    前提:假设我们的电脑或服务器已经正确安装了mysql服务器 一:连接和断开mysql服务器 1.1连接数据库服务器 shell> mysql -u user -p (user用户名通常为root ...

  6. jvm-垃圾回收gc简介+jvm内存模型简介

    gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...

  7. Spark SQL 性能优化再进一步:CBO 基于代价的优化

    摘要: 本文将介绍 CBO,它充分考虑了数据本身的特点(如大小.分布)以及操作算子的特点(中间结果集的分布及大小)及代价,从而更好的选择执行代价最小的物理执行计划,即 SparkPlan. Spark ...

  8. android底部菜单栏的编写

    开发工具android stdio,组件Radio Button 1.新建空项目DDDD 2.将事先准备好的图标复制到对应的文件夹中(如图),这五个文件夹都要拷进去,图标文件http://pan.ba ...

  9. MySQL笔记(7)---事务

    1.前言 前面具体讲了MySQL中的锁实现的方式,解释了是如何保证数据在并发情况下的可靠性,并提到了事务REPETABLE READ和READ COMMITTED,解释了一下这两种事务的不同.本章讲具 ...

  10. cmd窗口使用sftp命令非密钥和密钥登录SFTP服务器的两种方式

    cmd窗口使用sftp命令非密钥和密钥登录SFTP服务器的两种方式 一.在Windows环境下搭建SFTP服务器可参见http://www.cnblogs.com/Kevin00/p/6341295. ...