√n求单值欧拉函数
基本定理:

首先看一下核心代码:
核心代码

原理解析:
当初我看不懂这段代码,主要有这么几个问题:
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求单值欧拉函数的更多相关文章
- 求逆欧拉函数(arc)
已知欧拉函数计算公式 初始公式:φ(n)=n*(1-1/p1)*(1-1/p2).....*(1-1/pm) 又 n=p1^a1*p2^a2*...*ps^as 欧拉函数是积性函数 那么:φ(n ...
- 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, ...
- (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 ...
- POJ 2480 (约数+欧拉函数)
题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...
- Bzoj-2818 Gcd 欧拉函数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...
- hdu 2824 The Euler function(欧拉函数)
题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...
- UVA 10214 Trees in a Wood(欧拉函数)
题意:给你a.b(a<=2000,b<=2000000),问你从原点可以看到范围在(-a<=x<=a,-b<=y<=b)内整数点的个数 题解:首先只需要计算第一象限 ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- A - Bi-shoe and Phi-shoe 欧拉函数
/** 题目:A - Bi-shoe and Phi-shoe 链接:https://vjudge.net/contest/154246#problem/A 题意:每一个数都有一个得分,它的得分就是, ...
随机推荐
- Burpsuite常用模块详解以及渗透测试上的运用
0x00前言 哪有什么前言,大家好,我是浅安.QQ:320229344... 0x01 JDK的安装,以及Burpsuite的成功开启. burpsuite基于JAVA环境才能正常运行的.所以要先安装 ...
- JavaScript 函数式编程读书笔记1
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
- 人脸检测第一文---A Dream of Spring
人脸识别研究的人很多,可是,真正具有划时代意义的还要当属Paul Viola的一篇文章<RobustReal-time Object Detection>.这篇文章让 人脸识别在实际应用中 ...
- Scala + IntelliJ IDEA
学习路上的新起点:大数据Scala + Spark +(HDFS + HBase),本文主要介绍下Scala的基本语法和用法吧.最后再简单介绍一种Java开发工具IntelliJ IDEA的使用. S ...
- 机器学习技法笔记:06 Support Vector Regression
Roadmap Kernel Ridge Regression Support Vector Regression Primal Support Vector Regression Dual Summ ...
- HoloLens开发手记 - 语音输入 Voice input
语音是HoloLens三大重要输入形式之一.它允许你直接通过语言控制全息图像,而不用借助手势.你只要凝视全息图像然后说出语音命令即可.语音输入是自然的交互方式,它能够很好的改善复杂的交互,因为通过一条 ...
- [视频]K8飞刀 Discuz csrf Exp教程
[视频]K8飞刀 一键构造Discuz csrf Exp教程 链接:https://pan.baidu.com/s/1tVseP_ZBneKpXQueIncPcA 提取码:6qnh
- Django MTV
MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候 ...
- Android动态添加Fragment
Android动态添加Fragment 效果图如下: 项目结构图如下: Fragment1: package com.demo.dongtaifragment; import android.app. ...
- Maven的assembly插件实现自定义打包部署(包含依赖jar包)
微服务必备 优点: 1.可以直接导入依赖jar包 2.可以添加插件启动 .sh 文件 3.插件的配置以及微服务的统一打包方式 1.首先我们需要在pom.xml中配置maven的assembly插件 & ...