将整数提升为大国

时间:2012-02-17 20:09:45

标签: c++

请帮我解决在SPOJ上解决此编程问题的步骤:7683. Powered and Squared

问题需要将整数提升到非常高的功率 - 高达10 ^ 120。提升整数的功率在基数3中表示为250位数。一个简单的算法超时,因为乘法的数量非常高。有更好的方法吗?

1 个答案:

答案 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速度过慢的方式设置的,所以不幸的是,这对于使用字符指针的整个烦人的操作是必要的。