题目概况
解题思路
-
最开始的思路为高精度,但是后来一想,若按高精度乘法进行,时间复杂度就要爆炸(再多看一眼就要爆炸)。因此一眼快速幂高精度。但是仔细一想,所有的运算结果都要对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;
}