快速幂的学习与反思

题目概况


在这里插入图片描述

解题思路


  • 最开始的思路为高精度,但是后来一想,若按高精度乘法进行,时间复杂度就要爆炸(再多看一眼就要爆炸)。因此一眼快速幂高精度。但是仔细一想,所有的运算结果都要对10007取模,好像也用不到高精度,只需要对利用数组存一下y就可以了。

  • 快速幂思路:这里我们和传统的快速幂稍有不同,但是借用了快速幂的思路。传统快速幂使用的2进制的,base = base^2,为了方便我们每次取y的一位拿来计算,我们可以将其更改为十进制的。即每次取base的:

    b a s e , b a s e 10 , b a s e 100 . . . base,base^{10},base^{100}... base,base10,base100...等等进行计算。

代码设计:


#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int mod = 10007;
vector<LL> f[55][55];
vector<int>INF(50, 9);
//快速幂二进制(方便求解base的n次方)
long long fastPower(long long base, long long power) {
	long long result = 1;
	while (power > 0) {
		if (power % 2 == 1) {
			result = result * base % mod;
		}
		power = power / 2;
		base = (base * base) % mod;
	}
	return result;
}
//快速幂(10进制)
LL ksm(LL x, vector<LL> y, LL mod) {    
	LL ans = 1, base = x;
	while (y.size()!= 0) { //y中的每一位上面的数字均变为零的时候,就相当于power = 0 了
		int b = y.back();
		y.pop_back();
		ans *= fastPower(base, b);
		ans %= mod;
		base = fastPower(base, 10);
		base %= mod;
	}
	return ans;
}
LL x;
LL getx() {
	LL a;
	for (int i = 1; i <= 4; ++i) {
		getchar();
	}
	cin >> a;
	return a;
}
vector<LL> gety() {
	for (int i = 1; i <= 6; ++i) {
		getchar();
	}
	vector<LL> C;
	char a = getchar();
	while ((a = getchar()) != ']') {
		//putchar(a);
		if (isdigit(a)) {
			C.push_back(a - '0');
		}
		else
			continue;
	}
	return C;
}
vector<LL> y;
LL ans;
int main() {
	x = getx();
	x = x % mod;
	y = gety();
	ans = ksm(x, y, mod);
	cout << ans << endl;
	return 0;
}	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值