快速幂之模运算

描述

给定整数a,b,n,要求计算(a^b)mod n

输入

多组数据,每组数据一行,为三个用空格隔开的整数a,b,n

1<=a<=5000,0<=b<=10^8,1<=n<=5000000

输出

每组数据输出一行,为所求值

样例输入

2 3 5
2 2 4

样例输出

3
0

链接:http://202.119.236.66/acmhome/problemdetail.do?&method=showdetail&id=1037

这道题目应该用快速幂的方法来做,如果直接暴力求解会TLE。

可以将b按二进制位展开,b=f(n)*2^n+f(n-1)*2^(n-1)+f(n-2)*2^(n-2)+...+f(1)*2^1+f(0)*2^0;

则a^b=a^(f(n)*2^n+f(n-1)*2^(n-1)+f(n-2)*2^(n-2)+...+f(1)*2^1+f(0)*2^0)=a^(f(n)*2^n)*a^(f(n-1)*2^(n-1))*a^(f(n-2)*2^(n-2))*...*a^(f(1)*2^1)*a^(f(0)*2^0)

通项公式为a^(f(k)*2^k);这里的f(k)(k=0,1,2,3,...,n)取值为0或1,当f(k)=0时,通项公式的值为1,不需要考虑;当f(k)=1时,通项公式为a^(2^k),所以我们只要求出a^(2^k)的值就可以了;

实现代码如下(这里我们用的是迭代的方法):

#include<stdio.h>

int main()
{
    int a,b,n;
    long long ans,temp;

    while(~scanf("%d%d%d",&a,&b,&n))
    {
        ans = 1;temp = a;
        while(b)
        {
            if(b%2) ans=(ans%n)*temp;
            b /= 2;
            temp=temp%n;
            temp=(temp*temp)%n;
        }
        printf("%I64d\n",ans%n);
    }

    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值