5

蓝桥杯必备算法一:欧拉函数

 2 years ago
source link: https://blog.csdn.net/weixin_46627433/article/details/123489489
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

欧拉函数原理

一、欧拉函数的引入

请思考以下问题:
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?
(比如,在1到8之中,有多少个数与8构成互质关系?)

计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。

二、欧拉函数的定义

  • 定义: 欧拉函数φ(n)是一个定义在正整数集上得函数,φ(n)的值等于序列0,1,2,…,n-1中与n互素的数的个数。

特别的,φ(1)=1(和1互质的数(小于等于1)就是1本身)。

三、欧拉函数的性质

  1. 当p是素数时,φ§=p-1。
  2. 欧拉函数是积性函数,但不是完全积性函数。
  3. 当且只当n可以分解成两个互质的整数之积,n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2)。
    特别的,对于两个素数p,q, φ(pq)=(p-1)(q-1)。(RSA算法应用)
    当n>2时,φ(n)都是偶数,也即φ(n)≡0(mod2)。
    简单证明,因为若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1
    当p为2时,pk-1必为偶数;
    当p>2时,(p-1)必为偶数。

四、欧拉函数的计算方法

(一)解题思路

对于一个正整数N的素数幂分解N=P1q1P2q2…Pnqn,其中,Pi为素数(1≤i≤n)。
根据第二条性质得到:

φ(N)=φ(P1q1P2q2…Pnqn)=φ(P1q)φ(P2q2)…φ(Pnqn)

注意:每种质因数只有一个。
若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1,因为除了p的倍数外,其他数都跟n互质。
简单证明:φ(n)=pk-pk-1=(p-1)pk-1

证明:
由φ(n)的定义值,φ(pk)等于从pk减去在1,…,pk中与p不互素的数的个数。因为p是素数,故φ(pk)等于从pk减去在1,…,pk中被p整除的数的个数。而在
1,…,p,p+1,…,2p,…,pa-1 * p
中,易知p的倍数共有pa-1个,即得φ(n)=pk-pk-1=(p-1)pk-1

(二)编程计算

利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:

欧拉函数: φ(N)=N{∏p|N}(1-1/p)
亦即:
φ ( N ) = N ∗ ∏ ( 1 − 1 / p ) ( P 是 数 N 的 质 因 数 ) φ(N)=N* ∏(1-1/p)(P是数N的质因数)

φ(N)=N∗∏(1−1/p)(P是数N的质因数),如:

φ(10)=10×(1-1/2)×(1-1/5)=4; 10的质因数为2,5;
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8; 30的质因数为2,3,5;
φ(49)=49×(1-1/7)=42。 49的质因数为7。

五、欧拉函数扩展

设n≥1,则有∑φ(n)=n,其中d|n,d>0.

在这里插入图片描述

六、欧拉函数应用

在这里插入图片描述
题目输入输出样例

输入样例:
2
7 5
10 2
输出样例:
1
4

题目思路及代码

思路: f(n)函数就是欧拉函数的定义,并且g(n)函数就是欧拉函数扩展的定理应用,因此只需要进行计算即可
素数筛核心代码:

void pri(ll N){
    for(int i=2;i<=N;i++){
        if(!vis[i]){
            p[++tot]=i;
            vis[i]=1;
        }
        for(int j=1;j<=tot&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                break;
            }
        }
    }
}

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1e5+10;
const ll maxm=1e8+10;
const ll mod=1e9+7;
ll n,k;
ll p[maxn];
ll vis[maxn];
ll tot;
void pri(ll N){
    for(int i=2;i<=N;i++){
        if(!vis[i]){
            p[++tot]=i;
            vis[i]=1;
        }
        for(int j=1;j<=tot&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                break;
            }
        }
    }
}
ll ppi(ll x){
    ll ans=x;
    for(int i=1;i<=tot;i++){
        if(x%p[i]){
            continue;
        }
        ans=ans/p[i]*(p[i]-1);
        while(x%p[i]==0){
            x/=p[i];
        }
    }
    if(x>1){
        ans=ans/x*(x-1);
    }

    return ans;
}
int main(){
    pri(maxn-1);
    ll t;
    scanf("%lld",&t);
    while(t--){
            scanf("%lld%lld",&n,&k);
            k=(k+1)/2;
            for(int i=1;i<=k&&n>1;i++){
                n=ppi(n);
            }
            printf("%lld\n",n%mod);

    }
	return 0;
}

newCodeMoreWhite.png

推荐给大家的一段话


“遇事不决可问春风,春风不语即随本心”的意思是:对一件事犹豫不决,就问春风该如何做,春风给不出答案,就凭自己本心做出决断。“遇事不决可问春风,春风不语即随本心”一句出自网络作家“烽火戏诸侯”的《剑来》,其原文是:“遇事不决,可问春风。春风不语,遵循己心”。

在这里插入图片描述



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK