浅谈欧拉函数【复习】

浅谈欧拉函数【复习】

定义:

φ(n)表示小于n的正整数中和n互质的个数;

性质:

1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解)

2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解)

3.[1,n]中与n互质的数的和为n×φ(n)/2

4.Σφ(d)=n,其中(d|n)(感性理解)

5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数)

证明:

这里插入个游戏:

问题:求正整数3^83^的最后两位数

回到正题

一:√n求单个数的欧拉函数值:

根据性质五:

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e7 + 10;
int p, ans = 1, N;
void GetPhi() {
    for(int i = 2; i * i <= p; i++) {
        if(p % i == 0) {
            int now = i - 1; p /= i;
            while(p % i == 0) now = now * i, p /= i;
            ans = ans * now;
        }
    }
    if(p != 1) ans *= (p - 1);
}
int main() {
    cin >> p; N = p;
    GetPhi();
    cout << ans;
    return 0;
}

二:线性塞欧拉函数

以下就是用到的性质

性质一:

φ(p)=p-1,当且仅当p为素数时

性质二:

若p不为i的约数且p为素数

则φ(i?p)=φ(i)?φ(p)

=φ(i?p)=φ(i)?(p?1)

这一步同时利用了性质1和欧拉函数的积性

性质3

若p是i的约数且p为素数

则φ(i?p)=φ(i)?p

这个根据最开始的性质五可以得到

part code by wzxbeliever:

void init(){
    phi[1]=1;
    for(ri i=2;i<=n;i++){
        if(!vis[i])prime[++tot]=i,phi[i]=i-1;
        for(ri j=1;j<=tot&&i*prime[j]<=n;j++){
            vis[i*prime[j]]=1;
            if(!(i%prime[j])){phi[i*prime[j]]=phi[i]*prime[j];break;}
            else phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
光说不用等于放屁

例题一:

https://www.luogu.org/problem/P2158

分析:

由图观察发现能被看到的点当且仅当gcd(i,j)==1,

注意看图的时候将两点间空格看成一格,不要将点看成一格

所以问题转化为互质的点对有多少个

这里很容易想到欧拉函数

因为两边是对称的,只算一边就好了

code by wzxbeliever:

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ri register int
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=40005;
int n,tot;
ll ans;
bool vis[maxn];
int phi[maxn],prime[maxn];
il void init(){
    phi[1]=1;
    for(ri i=2;i<=n;i++){
        if(!vis[i])prime[++tot]=i,phi[i]=i-1;
        for(ri j=1;j<=tot&&i*prime[j]<=n;j++){
            vis[i*prime[j]]=1;
            if(!(i%prime[j])){phi[i*prime[j]]=phi[i]*prime[j];break;}
            else phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
int main(){
    scanf("%d",&n);
    if(n==1){printf("0\n");return 0;}//注意特判0
    init();
    for(ri i=1;i<=n-1;i++)
    ans+=phi[i];
    ans<<=1;ans++;
    printf("%lld\n",ans);
    return 0;
}

大体上就这么多了

原文地址:https://www.cnblogs.com/wzxbeliever/p/11799357.html

时间: 2024-07-29 16:19:28

浅谈欧拉函数【复习】的相关文章

浅谈欧拉函数 By cellur925

1.某神犇Blog 学了三遍的 欧拉函数φ--DEADFISH7 2.我要做一些补充o(* ̄▽ ̄*)o $φ(1)=1$: 公式有两种形式,一种有太多除法,实际可能会慢些.通用 对于任意$n$>1,1~$n$中与$n$互质的数之和等于$n*φ(n)/2$. 是积性函数. $sigma(d|n) φ(d)=n$. 代码实现 1°:朴素的质因数分解顺便求出 void init_phi() { int ans=n; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) {

浅谈欧拉函数

笔者太菜,现在才学欧拉函数还学得不咋滴-- 定义 定义:\(φ(n)\)是小于等于\(n\),且与\(n\)互质的数的个数. 写成另一个式子就是:\(∑_{i=1}^{n} 1[gcd(i,n)==1]\) 有一个结论,是\(φ(n)\)为积性函数,即有\(φ(ab)=φ(a)*φ(b)\). 还有一些其它性质:当\(p\)为质数时,显然有\(φ(p)=p-1\). 若\(p|n\) 且\(p^2 | n\),则\(φ(n)=φ(n/p)*p\) 若\(p|n\) 且不满足\(p^2 | n\)

简谈欧拉函数

START 参考博客:https://blog.csdn.net/qq_39922639/article/details/77511761 欧拉函数是积性函数的一种,所谓积性函数是指满足,gcd(a,b)&&ƒ(a*b)=ƒ(a)*ƒ(b)的函数,特别的,若gcd(a,b)!=1但是ƒ(a*b)=ƒ(a)*ƒ(b)仍然满足,我们称之为完全积性函数. 定义: 记欧拉函数φ(n)表示从{1,2,3......n}中和n互质的数的个数,即:φ(n) = 性质: 1.φ(n) = n-1 (n为质

欧拉函数 / 蒙哥马利快速幂 / 容斥

一:知识点 欧拉函数参考1 浅谈欧拉函数参考2 欧拉函数的定义: 在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质(即gcd为1)的正整数(包括1)的个数,记作φ(n).     欧拉函数的延伸: 小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2  (n>1). 欧拉函数φ(x)模板: ll Euler(int n)//即求φ(x) { ll ret=n; for(int i=2;i<=sqrt(n);i++) if(n%i==0) { ret=ret/i*(

算法复习——欧拉函数(poj3090)

题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For exa

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方法的时间复杂度为O(N),随着N的增加,效率依然很慢.这里有个O()的方法:对于一个合数,其必用一个约数(除1外)小于等于其平方根(可用反证法证明),所以我们只需要判断2-之间的数即可. bool is_prime(int num) { const int border = sqrt(num); for

bzoj 4026 dC Loves Number Theory (主席树+数论+欧拉函数)

题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值 还复习了欧拉函数以及线性筛逆元 考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[j]是区间内所有出现过的质数) 那么考虑找出区间内所有出现过的质数,这思路和HH的项链是不是很像?? 由于此题强制在线,所以把树状数组替换成了主席树而已 原来我以前写的主席树一直都是错的......还好推出了我原来错误代码的反例 在继承上一个树的信息时,注意不要破坏现在的树 1 #include <cs

欧拉函数

void Euler_Sieve_Method(int * euler, int n) { euler[1] = 1; for (int i = 2; i < n; i++) { euler[i] = i; } for (int i = 2; i < n; i++) { if (euler[i] == i) { for (int j = i; j < n; j += i) { euler[j] = euler[j] / i * (i - 1); } } } } void Euler_Si

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i