蓝桥杯算法训练 A的B的C次方次方

问题描述

        //据说很多人的题目会有一大堆废话,本傻×就不在这里废话了。
  就是叫你算A的B的C次方次方。
  当然了,为了方便起见,把答案%1,000,000,007输出就好。


输入格式

        一行,三个整数A,B,C,以空格隔开。


输出格式


  输出A的B的C次方次方%1,000,000,007。


样例输入


3 4 5


样例输出


763327764


数据规模和约定


0≤A,B,C≤1,000,000,000

思路:

首先需要理解题目,是要先求出B的C次方,假设结果为D,再求出A的D次方。这里要用到快速幂,快速幂就是指数不断除2,底数不断平方,假设初始结果为1,当指数为奇数时,结果乘以此时的底数。由于(a*b)%c=(a%c*b%c)%c,所以我们只需要每次计算底数取模和每次计算结果取模就行了。这里还要用到一个费马小定理:若存在整数 a , p 且gcd(a,p)=1,即二者互为质数,则有a^(p-1)≡ 1(mod p)。这里的≡是恒等于的意思,我实在理解不来,只知道在求B的C次方时取模为MOD-1就可以了。

代码如下:
#include<bits/stdc++.h>
using namespace std;
const long long MOD=1000000007;
int main()
{
	long long a,b,c;
	cin>>a>>b>>c;
	long long result=1,d=1;
	while(c!=0)//先求出b的c次方,结果为d 。
	{
		if(c&1)	d=d*b%(MOD-1);//注意根据费马小定理,这里取模为MOD-1,下面MOD-1同理。这里的c&1是判断奇偶。
		c>>=1;//位运算,和c/=2同理。
		b=b*b%(MOD-1);
	}
	while(d!=0)//再求出a的d次方 。
	{
		if(d&1)	result=result*a%MOD;
		d>>=1;
		a=a*a%MOD;
	}
	cout<<result;
	return 0;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值