快速幂 C语言描述

问题类型:求 a^b mod c 值的问题

问题难点:在C语言中 a^b如果b较大,a较多那么我们的时间复杂度是比较大的

优化原理:二进制优化法,什么是二进制优化法呢?其实法如其名,我们将一个较大的数字通过二进制表示(比如,我们提前记录 0 1 2 4 8 ... 这些2^x的数字,再通过二进制组合出b就可以快速得到a^b的值,如32如果每次直接幂运算32次就比较耗时,通过处理为0010 0000,我们就只需要找出从右至左第六位即可)

问题实例:

给定 n 组 a(i),b(i),p(i),对于每组数据,求出 a(i)^b(i) mod p(i) 的值。

输入格式

第一行包含整数 n。

接下来 nn 行,每行包含三个整数 a(i),b(i),p(i)。

输出格式

对于每组数据,输出一个结果,表示 a(i)^b(i) mod p(i) 的值。

每个结果占一行。

数据范围

1≤n≤100000,
1≤a(i),b(i),p(i)≤2×10^9

输入样例:

2
3 2 5
4 3 9

输出样例:

4
1

答案展示

#include<stdio.h>

long long quick_mi(int a, int b, int p)
{
    long long res = 1 % p;
    while (b) //二进制处理b
    {
        if (b & 1) res = res * a % p; //与运算 即第一位是1即表示可处理
        a = a * (long long)a % p;
        b >>= 1;  //将二进制右移,使我们可以处理第一位
    }
    return res;
}


int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        int a, b, p;
        scanf("%d%d%d", &a, &b, &p);
        printf("%lld\n", quick_mi(a, b, p));
    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值