快速幂之拙见

目录

0. 写在前边

1.应用

2.原理

3.例题

0. 写在前边

某年几月几日,余于家中学算法,为加强理解以记之,故作此文,多不达意,不喜勿喷。

1.应用

顾名思义,即快速求出a的k次方mod p 的结果(其中0 <= a, k, p <= 10^9 ),时间复杂度为O(log k)

2.原理

(本人实力有限,建议自己动手在纸上写一写)

将a^k用二进制的方法表示出来

首先,我们先把a^k mod p 预处理成 a^2^0 mod p,  a^2^1 mod  p , .... ,  a^2^logk mod p.

如何预处理呢?

a^2^0 即 a^1 = a^2^0, a^2^1 = (a^2^0)^2, .... , a^2^logk = (a^2^(logk - 1))^2 即,每一个都是上一个数的平方。

那么怎么把 a^k 表示出来呢?

可以把a^k拆成若干前面我们处理出来的部分的幂的和

a^k = a^2^x1 + a^2x2 + ... + a^2^x = a^(2^x1 + 2^x2 + ... + 2^x),再换成二进制就可以了

比如

k 的二进制 = (110110) k = 2^1 + 2^3 + 2^4 + 2^8; (是1的位加上就可以了)。

最后

将每一项 mod p;

举个栗子:

4^5 mod 10;

我们先预处理出 4^2^0 = 4 (mod 10),  4^2^1 = ( (4^2^0)^2 ) = ( 4^2 ) = 6 (mod 10),   4^2^2  = ( (4^2^1)^2 ) = 6^2  = 6 (mod 10),   ....

5的二进制为 101 =  2^0 + 2^2;

4^5 = 4^(2^0+2^2) = 4^2^0 * 4^2^2 = 4 * 6 = 4 (mod 10);

核心在于:反复平方。

代码如下:

        // a 的 b 次方对 p 取模
        int res = 1 % p; //res 为取模后的值,当b为0时,不进入循环,所以直接 mod p;
        while(b)
        {
            if(b & 1) res = res * a % p; //判断二进制第0位是否为1
            b >>= 1;  //移到第0位
            a = a * a % p;  //预处理,重复平方
        }

3.例题

求 a 的 b 次方对 p 取模的值。

输入格式

三个整数 a,b,p在同一行用空格隔开。

输出格式

输出一个整数,表示a^b mod p的值。

数据范围

0≤≤a,b≤10^9
1≤p≤10^9

输入样例:

3 2 7

输出样例:

2
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

int main()
{
    int a, b, p;
    cin >> a >> b >> p;
    int res = 1 % p;
    while (b)
    {
        if(b & 1) res =(LL)res * a % p; // a的数值达到10^9,会爆int
        b >>= 1;
        a =(LL)a * a % p;
    }
    cout << res << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Vue 3中,没有直接的`created()`语法糖。在Vue 2中,`created()`是一个生命周期钩子函数,用于在组件实例创建后执行特定的操作。然而,在Vue 3中,为了简化组件的写法,将数据和方法的声明与组件实例的创建过程分离,采用了新的`<script lang="ts" setup>`语法糖来替代传统的选项API。使用`setup()`函数来声明组件的数据和方法。 如果你想在Vue 3中实现类似于`created()`的功能,可以在`setup()`函数中使用`onMounted()`钩子函数。`onMounted()`会在组件实例挂载到DOM后被调用,相当于Vue 2中的`created()`。你可以在`onMounted()`中执行需要在组件创建后立即执行的操作。 下面是一个示例代码,展示了如何使用`onMounted()`来实现类似于`created()`的功能: ```javascript <script lang="ts" setup> import { onMounted } from 'vue' onMounted(() => { // 在组件实例挂载到DOM后执行的操作 console.log('Component created') }) </script> ``` 在上面的代码中,`onMounted()`钩子函数中的回调函数会在组件实例挂载到DOM后被调用,你可以在其中执行你需要的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [keylime:用JavaScript处理原型的好方法](https://download.csdn.net/download/weixin_42117032/18918167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [关于vue3Setup语法糖的拙见以及实际运用](https://blog.csdn.net/Web_Sam/article/details/127276270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值