√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 题意:每一个数都有一个得分,它的得分就是, ...
随机推荐
- MFC中的Debug Assertion Failed 如何查找原因
编写MFC程序时经常会遇到下图所示的断言失败问题 报错对话框中给出了一个目录,是在F盘,但是查找之后会发现电脑里可能根本没有这个目录. 最后发现可以在VS的安装目录下找到这个文件: \atlmfc\s ...
- 关于调试WCF时引发的异常XmlException: Name cannot begin with the '<' character, hexadecimal value 0x3C” on Client Side
问题描述:在使用VS2015调试WCF时,偶遇抛出异常名称不能以“<”字符(十六进制0x3c)开头,平时运行时(不调试)没有问题的. 解决方法:检查后发现为了检查异常的位置,勾选了引发通用语言运 ...
- Mybatis延迟加载、缓存
一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多 ...
- OSLab多线程
日期:2019/3/26 内容:多线程. 一.基本知识 线程的定义 线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单 ...
- 错误:无效参数:could not find capabilities for arch=aarch64
现象:错误:无效参数:could not find capabilities for arch=aarch64 解决: qemu源码编译:(需要指定--cpu=aarch64) ./configure ...
- dubbo rpc调用,接收到的bean为null原因?
前几天对接公司内部其他部门的系统,用dubbo调用,dubbo看起来很简单,但是却让我们调试了好久啊! 下面是调试纪录: 1. 调用该服务时,直接调不通,查看错误为 no provider ? 然后就 ...
- 【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
目录 一.写在前面 二.技术广度的快速准备 三.技术深度的快速准备 四.基础功底的快速准备 五.下篇预告 一.写在前面 春节长假转眼已过,即将迎来的是一年一度的金三银四跳槽季. 假如你准备在金三银四跳 ...
- python编译生成的.pyc作用
如果 Python 进程在机器上拥有写入权限,那么它将把程序的字节码保存为一个以 .pyc 为扩展名的文件( ".pyc" 就是编译过的 ".py" 源代码). ...
- linux中Java项目占用cpu、内存过高时的排查经历
一.使用top命令查看占用高资源的java项目的进程ID(pid): top 二.查看该进程中的线程所占用资源的情况:top -Hp pid 三.查看该线程对应的16进制:printf %x 1112 ...
- Java学习之Servlet篇
<JAVA遇见HTML——Servlet篇> Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命 ...