算法提升之数学(欧拉函数的相关应用)

今天分享关于欧拉函数的相关知识,通过欧拉函数可以解决求解单点的数值质数个数,以及运用欧拉定理可以将大数求幂的值给变小,这部分内容相信对大家能有所帮助。

1.欧拉函数的相关定义

2.欧拉单点函数的求法

3.欧拉定理

接下来将通过几道例题帮助大家更好地理解:

题目描述

定义F(n)=∏1n​i。给定n,m,求nFm​ 对 109+7 取模后的值。

1≤n≤109,1≤m≤106

输入描述

输入共一行,包含两个整数 n,m。

输出描述

输出共一行,表示答案。

输入案例:

2 3

输出案例:

64

代码部分:

#include <iostream>
using namespace std;
using ll=long long;
const ll q=1e9+7;
ll qmi(ll a,ll n)
{ll ans=1;
while(n)
{
  if(n&1)ans=ans*a%q;
  a=a*a%q;n>>=1;
}return ans;}
int main()
{ll n,m;cin>>n>>m;
ll c=1e9+7;ll phi=c;
for(int i=2;i<=c/i;i++)
{
  if(c%i)continue;
  phi=phi/i*(i-1);
  while(c%i==0)c/=i;
}
if(c>1)phi=phi/c*(c-1);
ll b=1;
for(int i=1;i<=m;i++)b=b*i%phi;
cout<<qmi(n,b);
  return 0;
}

这是关于欧拉函数应用的模版问题,希望大家可以通过这道题好好理解这个部分。

两个整数(或正整数)的最大公约数(GCD)为 1时,称这两个数互质。

问题描述

小蓝是一名喜欢动手创造的学生,这天他利用废旧物品改造了一台电池储蓄盒。该储蓄盒可以将自身储存的电量输送给其他电器。每次输送完电量后,储蓄盒里的电量就会减少。电池储蓄盒的电量上限为正整数 nn ,当储蓄盒的电量值为 n 时,它只能输送给那些电量值比 n 小且与 n 无共享因子(除了 1)的电器。

小蓝好奇当这个电池储蓄盒的电量为 n 时,它可以输送几次电量给其他电器。

输入格式

输入仅一行,包含一个正整数 n(n≤109)。

输出格式

输出电池储蓄盒的电量为 n 时,它能输送给其他电器电量的次数。

输入案例:

7

输出案例:

6

代码部分:

#include <iostream>
using namespace std;
using ll=long long;
int main()
{
    ll n;
    cin>>n;
    ll phi=n;
    for(ll i=2;i*i<=n;i++){
        if(n%i)continue;
        phi=phi/i*(i-1);
        while(n%i==0)n/=i;
    }
    if(n>1)phi=phi/n*(n-1);
    cout<<phi;
    return 0;
}

注意理解互质的概念

3.

问题描述

求 2(3(4(...2023)) 的值对 2023 取模的结果。

注: 上式都是指数,可写为 2∗∗(3∗∗(4∗∗(...2023...)) 其中 ∗∗∗∗ 表示指数。

代码部分:

#include<bits/stdc++.h>
using namespace std;
#define int long long
//欧拉函数 
int get_eular(int n){
    int phi=n;
    for(int i=2;i<=n/i;i++){
        if(n%i)    continue;
        while(n%i==0)    n/=i;
        phi=phi/i*(i-1);
    }
    if(n>1)phi=phi/n*(n-1);
    return phi;
} 
//快速幂
int quick(int base, int x, int mod){
    int res=1;
    while(x){
        if(x&1)    res=res*base%mod;
        base=base*base%mod;
        x>>=1;
    }
    return res;
} 
signed main(){
    int a=get_eular(2023); 
    int t=2023; 
    for(int i=2022;i>=3;i--){
        t=quick(i,t,a);};
    t=quick(2,t,2023);
    cout<<t<<endl;    
    return 0;
}

注意这道题连乘连求幂的区别

好了,今天的分享就到这里,希望大家能够好好理解这个部分。

希望大家能够多多关注博主,后续也将继续分享相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值