第十四届蓝桥杯国赛:2023次方的思考(指数塔,数论)

在这里插入图片描述

首先我们要知道,正常计算的话,指数优先级最高,因此得先计算指数,比如:
2 3 2 = 512 2^{3^2}=512 232=512
欧拉定理的关键在于,它允许我们通过减少计算的指数大小来简化模运算。

1、无脑的想法:

指数模+快速幂(错的)

#include <iostream>
using namespace std;
int main()
{
    int result = 2023;//result 存储 指数
    for(int i = 2022;i >= 2; --i){//遍历底数
        int b = result;
        int a = i;
        int ans = 1;
        while(b){
            if((b & 1) == 1){
                ans = (ans * a) % 2023;
            }
            a = (a * a) % 2023;
            b >>= 1;
        }
        result = ans;
    }
    cout << result;//1259
    return 0;
}

指数并不能直接取模!取模只在四则运算里面好用,在指数里面就不太能直接用了。
2 10 m o d   9 = 1024   m o d   9 = 7 2^{10} mod\ 9 = 1024\ mod\ 9 = 7 210mod 9=1024 mod 9=7 2 10 m o d   9   ≠ 2   m o d   9 = 2 2^{10} mod\ 9\ ≠2\ mod\ 9=2 210mod 9 =2 mod 9=2
可以证明指数不能随便取模。

普通的取模运算只能运用于加减乘除(四则运算) 下面是这些基本算术操作在模运算下的特性:

  1. 加法(Addition):

    • ( a + b ) m o d    n = [ ( a m o d    n ) + ( b m o d    n ) ] m o d    n (a + b) \mod n = [(a \mod n) + (b \mod n)] \mod n (a+b)modn=[(amodn)+(bmodn)]modn
    • 加法的模运算遵循分配律。
  2. 减法(Subtraction):

    • ( a − b ) m o d    n = [ ( a m o d    n ) − ( b m o d    n ) + n ] m o d    n (a - b) \mod n = [(a \mod n) - (b \mod n) + n] \mod n (ab)modn=[(amodn)(bmodn)+n]modn
    • 减法也遵循类似的规则,但要注意结果保持非负
  3. 乘法(Multiplication):

    • ( a × b ) m o d    n = [ ( a m o d    n ) × ( b m o d    n ) ] m o d    n (a \times b) \mod n = [(a \mod n) \times (b \mod n)] \mod n (a×b)modn=[(amodn)×(bmodn)]modn
    • 乘法在模运算中同样遵守分配律。
  4. 除法(Division):

    • 除法在模运算中比较复杂。不能直接应用常规除法运算,需要用到乘法逆元。如果存在, a a a 在模 n n n 下的乘法逆元 a − 1 a^{-1} a1 满足 a a − 1 ≡ 1 m o d    n aa^{-1} \equiv 1 \mod n aa11modn。然后, a / b m o d    n a / b \mod n a/bmodn 可以表示为 a × b − 1 m o d    n a \times b^{-1} \mod n a×b1modn

在处理幂运算(如 a b m o d    n a^b \mod n abmodn)时,不能直接对指数 b b b 应用普通的模运算,除非考虑到适当的数论属性(如欧拉函数 ϕ ( n ) \phi(n) ϕ(n)),这是因为幂运算涉及重复的乘法过程,指数的大小直接影响最终结果。因此,在涉及到幂运算时,需要谨慎处理指数的模运算,通常基于 ϕ ( n ) \phi(n) ϕ(n) 来简化指数大小。


2、有脑但不够的想法

费马小定理(错的)

  • 费马小定理:
    费马小定理: a p − 1 ≡ 1 ( m o d   p )      p 是质数 , g c d ( a , p ) = 1 费马小定理:a^{p-1} ≡ 1(mod\ p)\ \ \ \ p是质数,gcd(a,p)=1 费马小定理:ap11(mod p)    p是质数,gcd(a,p)=1

如果 2023 是质数,则 a 2022 ≡ 1 ( m o d   2023 ) 如果2023是质数,则a^{2022} ≡ 1(mod\ 2023) 如果2023是质数,则a20221(mod 2023)
如果 2023 是质数,则 a 2023 ≡ a ( m o d   2023 ) 如果2023是质数,则a^{2023} ≡ a (mod\ 2023) 如果2023是质数,则a2023a(mod 2023)
由于 a = b 2022 ,且 b 2022 ≡ 1 ( m o d   2023 ) 由于a = b^{2022},且b^{2022} ≡ 1(mod\ 2023) 由于a=b2022,且b20221(mod 2023)
则有, a 2023 ≡ a ≡ 1   ( m o d   2023 ) ,其中 a = 2 3 4 ( ⋅ ⋅ ⋅ ) 2022 则有,a^{2023} ≡ a ≡ 1\ (mod\ 2023),其中a = 2^{3^{4^{(···)^{2022}}}} 则有,a2023a1 (mod 2023),其中a=234(⋅⋅⋅)2022
因此得结果为 1 。 因此得结果为1。 因此得结果为1

错误!因为2023压根不是质数
不过我们需要注意的是,如果是按原题来理解:
而且这样做还存在一个问题,你把a看成一个整体考虑问题了,因为你把底数包裹起来了,然后看最顶层的指数,这就相当于 2 3 2 2^{3^2} 232,把 2 3 2^{3} 23看成一个整体了,这很显然与指数计算的方式相违背!

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int f = sqrt(2023);
    for(int i = 2;i <= f;++i){
        if(2023 % i == 0){
            cout << i << " * " << 2023 / i << " = 2023"<<endl;
        }
    }
    return 0;
}

输出:

7 * 289 = 2023
17 * 119 = 2023

3、正解

欧拉定理 : 数论基础

  • 欧拉定理:
    a ϕ ( n ) ≡   1 ( m o d   n ) , g c d ( a , n ) = 1 a^{\phi(n)} ≡\ 1(mod\ n),gcd(a,n)=1 aϕ(n) 1(mod n),gcd(a,n)=1
    b   =   c ϕ ( n ) + d ,则 a b ≡   a c ϕ ( n ) + d ≡   a d ( m o d   n ) b\ =\ c\phi(n)+d,则a^{b} ≡\ a^{c\phi(n)+d}≡\ a^d(mod\ n) b = cϕ(n)+d,则ab acϕ(n)+d ad(mod n)
    因此 a b ≡   a b   m o d   ϕ ( n ) ( m o d   n ) a^{b} ≡\ a^{b\ mod\ \phi(n)}(mod\ n) ab ab mod ϕ(n)(mod n)

因此使用欧拉定理可以“模”去一部分指数。

因此由于本题的底数是 2 2 2 2 2 2的任意次幂都和 2023 2023 2023互质,所以满足欧拉定理。

  • 欧拉函数的计算方式:
    在这里插入图片描述
    其中 p i p_i pi n n n的所有质因数,计算方式应该是 ϕ ( n ) = n × ∏ i = 1 S ( p i − 1 p i ) \phi(n)=n×\prod_{i=1}^{S}(\frac{p_i-1}{p_i}) ϕ(n)=n×i=1S(pipi1)

根据上述不过我们需要注意的是,如果是按原题来理解:
令计算的指数塔是 2 a   m o d   2023 2^a\ mod\ 2023 2a mod 2023,则结果为 2 a   m o d   ϕ ( 2023 ) m o d 2023 2^{a\ mod\ \phi(2023)} mod 2023 2a mod ϕ(2023)mod2023,也就是 2 a   m o d   1632   m o d   2023 2^{a\ mod\ 1632}\ mod\ 2023 2a mod 1632 mod 2023,那么接下来需要知道 a   m o d   1632 a\ mod\ 1632 a mod 1632的大小,但指数塔 a = 3 b a = 3^b a=3b,此时计算的指数塔是 3 b   m o d   1632 3^b\ mod\ 1632 3b mod 1632,接下来 b   m o d   ϕ ( 1632 ) b\ mod\ \phi(1632) b mod ϕ(1632)

好好好,这样不一定互质了,所以问题太大了。

正确的解法:

#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;
}

究其原因,我是真没想清楚。

### 第十四届蓝桥杯 C++ 解题思路与题目分析 虽然当前提供的引用并未直接涉及第十四届蓝桥杯的具体内容,但从其他相关事的描述中可以推测出一些通用的解题策略和常见考点。 #### 常见考点总结 蓝桥杯通常会覆盖算法设计、数据结构应用以及编程技巧等多个方面。以下是基于以往比经验可能涉及到的核心知识点: 1. **字符串处理** 字符串操作是常见的基础考察点之一,在某些情况下需要对大小写字母转换或者特定字符替换等问题进行解决[^2]。例如通过遍历输入字符串并调整其中字母的形式完成指定任务。 2. **动态规划 (Dynamic Programming)** 动态规划是一种重要的优化技术,适用于求解具有重叠子问题性质的问题。这类问题往往要求计算最大值/最小值路径长度等指标。尽管未提及具体实例,但在往年的比中多次出现过此类需求[^1]。 3. **贪心算法 (Greedy Algorithm)** 贪心法用于快速找到局部最优解从而达到全局最佳效果的情况也较为普遍。它依赖于每次决策都选取当时看来最有利的选择直到整个过程结束为止。 4. **图论(Graph Theory)** 图形理论中的广度优先搜索(BFS),深度优先搜索(DFS)及其变种形式都是热门话题。它们可用于寻找连通分量数目、判断是否存在环路等多种场景下。 5. **数论(Number Theory)** 数学运算尤其是整除关系判定、质因数分解等方面的知识同样不可或缺。这些技能可以帮助参者更高效地解答关于大整数乘方模余等相关难题。 #### 示例代码片段展示 下面给出一段简单的C++程序用来演示如何实现基本功能——将给定的小写英文字母转变为对应的大写字母: ```cpp #include <iostream> using namespace std; int main(){ string s; cin >> s; // 输入一串字符 for(char& c : s){ if(c >= 'a' && c <= 'z') { c = toupper(c); // 使用标准库函数toupper()来进行转化 } } cout << s << endl; // 输出修改后的结果 return 0; } ``` 此段落仅作为教学用途,并不代表实际考题的内容或难度级别。 #### 结语 综上所述,准备参加类似规模的比时应当注重夯实基础知识的同时加强实战演练频率以提升临场发挥水平。针对不同类型的习题分类整理归纳有助于形成系统化的学习框架进而提高效率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yorelee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值