【模板】快速幂

题目描述

给你三个整数 a,b,p,求 a^bmodp。

输入格式

输入只有一行三个整数,分别代表 a,b,p。

输出格式

输出一行一个字符串 a^b mod p=s,其中 a,b,p 分别为题目给定的值, s 为运算结果。

输入输出样例

输入 

2 10 9

输出 

2^10 mod 9=7

说明/提示

数据规模与约定

对于 100% 的数据,保证 0≤a,b<231,a+b>0,2≤p<231。

#include<bits/stdc++.h>
using namespace std;
int a,b,p;


// 一.取模运算法则(百度百科)

// 定义

// 给定一个正整数p,任意一个整数n,一定存在等式 :
// n = kp + r ;
// 其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。
// 对于正整数 p 和整数 a,b,定义如下运算:
// 取模运算:a % p(或a mod p),表示a除以p的余数。
// 模p加法: ,其结果是a+b算术和除以p的余数。
// 模p减法: ,其结果是a-b算术差除以p的余数。
// 模p乘法: ,其结果是 a * b算术乘法除以p的余数。
// 说明:
// 1. 同余式:正整数a,b对p取模,它们的余数相同,记做 或者a ≡ b (mod p)。

// 2. n % p 得到结果的正负由被除数n决定,与p无关。例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。

// 基本性质
// 若p|(a-b),则a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)
// (a % p)=(b % p)意味a≡b (% p)
// 对称性:a≡b (% p)等价于b≡a (% p)

// 传递性:若a≡b (% p)且b≡c (% p) ,则a≡c (% p)

// 运算规则
// 模运算与基本四则运算有些相似,但是除法例外。其规则如下:
// (a + b) % p = (a % p + b % p) % p (1)
// (a - b) % p = (a % p - b % p) % p (2)
// (a * b) % p = (a % p * b % p) % p (3)

// a ^ b % p = ((a % p)^b) % p (4)

// 结合律:
// ((a+b) % p + c) % p = (a + (b+c) % p) % p (5)

// ((a*b) % p * c)% p = (a * (b*c) % p) % p (6)

// 交换律:
// (a + b) % p = (b+a) % p (7)

// (a * b) % p = (b * a) % p (8)

// 分配律:
// (a+b) % p = ( a % p + b % p ) % p (9)

// ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (10)

// 重要定理
// 若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(11)
// 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(12)
// 若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),

// (a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (13)

long long fastPower(long long base,long long power,long long p)
{
    long long result=1;
    while(power>0){
        if(power%2==0){
            power=power/2;
            base=base*base%p;
        }
        else{
            result=result*base%p;
            power=power/2;
            base=base*base%p;
        }
    }
    return result;
}

int main()
{
    cin>>a>>b>>p;
    // int ans=1;
    // for(int i=1;i<=b;i++)
    // {
    //     ans=ans*a;
    //     ans%=p;
    // }
    // ans%=p;
    int ans;
    ans=fastPower(a,b,p);
    cout<<a<<"^"<<b<<" mod "<<p<<"="<<ans<<endl;
}

优化后:

long long fastPower(long long base,long long power,long long p)
{
    long long result=1;
    while(power>0){
        if(power%2==1){
            result=result*base%p;
        }
        power=power/2;
        base=base*base%p;
    }
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值