LeetCode | 372. Super Pow 数学原理题

本文介绍了一种高效计算a^b%1337的方法,其中a为正整数,b为极大正整数并以数组形式给出。通过将b转换为二进制形式,并利用快速幂模运算简化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Yourtask is to calculate ab mod 1337 where a is a positive integer and b isan extremely large positive integer given in the form of an array.

Example1:

a = 2

b = [3]

 

Result: 8

Example2:

a = 2

b = [1,0]

 

Result: 1024

这一题给你一个a和b,问你a^b%1337的值是多少,值得一提的是这里的b可以是任意大的数

我的思路是,由于(a*a)%m=k1,也就是a^(2^1)=k1,

可知,设b=a*a,那么(b*b)%m=(k1*k1)%m,也就是a^(2^2)%m=(k*k)%m=k2,

同样可知,设c=b*b=a^4,那么(c*c)%m=a^(2^3)%m=(k2*k2)%m=k3,

。。。。

(p*p)%m=a^(2^n)%m=(kn-1*kn-1)%m=kn,,

这里需要求a^(b),那么我们可以将b化为2^n1+2^n2…(就是将b转换成2进制),那么a^(b)%m=(a^(2^n1)%m* a^(2^n2)%m…)%m

而a^(2^nn)%m的值可以由上面的递推公式计算出来

class Solution {
public:
int dividTwo(vector<int> & num,int & numI)
{
	if (numI == num.size()) return -1;
	int tmp=0;
	for (int i = numI; i < num.size(); i++)
	{
		tmp = tmp * 10 + num[i];
		num[i] = tmp / 2;
		tmp = tmp % 2;
	}
	if (num[numI] == 0) numI++;
	return tmp;
}

int superPow(int a, vector<int>& b) {
	int result = 1; int bI = 0;
	int k=a%1337;
	int tmp = dividTwo(b,bI);
	while (tmp != -1)
	{
		if (tmp != 0) result = (result * k) % 1337;
		k = (k*k) % 1337;
		tmp = dividTwo(b,bI);
	}
	return result;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值