请帮我解决在SPOJ上解决此编程问题的步骤:7683. Powered and Squared。
问题需要将整数提升到非常高的功率 - 高达10 ^ 120。提升整数的功率在基数3中表示为250位数。一个简单的算法超时,因为乘法的数量非常高。有更好的方法吗?
答案 0 :(得分:0)
解决这个问题的关键是实现“正方形快速取幂”中的“方形”不是一个神奇的数字:它可以是立方体,也可以是你想要的任何力量。这个特殊问题需要多维数据集取幂,因为b
是用base-3表示法写的。
扩展经典算法以使用立方体相对容易:
#include <cstdio>
#include <cstdlib>
#include <cstring>
typedef long long i64;
int main(int argc, char* argv[]) {
char buf[1024];
fgets(buf, sizeof(buf), stdin);
int t = atoi(buf);
while (t--) {
fgets(buf, sizeof(buf), stdin);
char* b;
i64 a = strtol(buf, &b, 10);
// b points to the first space; find the second space
b = strchr(++b, ' ');
// This is where m begins
i64 m = atoi(b--);
a %= m;
i64 res = 1;
// We process b starting from the back
while (*b != ' ') {
if (*b == '1') {
res *= a;
} else if (*b == '2') {
// The part that differs from the classic algorithm is here:
res *= a*a;
}
res %= m;
// We do exponentiation by cubes, hence it's a*a*a
a = (a * a * a) % m;
// End of the interesting part
b--;
}
printf("%d\n", (int)res);
}
return 0;
}
SPOJ中的问题是以一种使C ++ I / O速度过慢的方式设置的,所以不幸的是,这对于使用字符指针的整个烦人的操作是必要的。