【快速幂取模】【AOJ-569】乘的更快

Description
上初中的时候我们就学会了幂乘运算,可是我们却不知道对于高阶的幂乘,出结果的方法比较慢,那么你有什么更好的方法吗?

 

Input
第1行,一个整数N(1<=N<=1000),表示要计算的数据组数
第2-N+1行,每行两个整数,第1个是x(1<=x<=100),表示底数,第2个是y(0<=y<=10000000),表示指数。

 

Output
对于每一组输入的数据给出幂乘的结果x^y(x的y次方),由于结果可能非常大,要求对99991取余。

 

Sample Input
Original Transformed
3
2 3
5 10
3 0
3[EOL] 
2[SP]3[EOL] 
5[SP]10[EOL] 
3[SP]0[EOL] 
[EOF] 

 

Sample Output
Original Transformed
8
66498
1
8[EOL] 
66498[EOL] 
1[EOL] 
[EOF] 
/**************************************************************************************************************
思路:快速幂取模
注意:要把int类型的x转化为long long 或__int64
**************************************************************************************************************/
#include <cstdio>
int pow_mod(int x, int y);
int main()
{
    freopen("data.in", "r", stdin);
    int n;
    scanf("%d", &n);
    while(n--)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        printf("%d\n", pow_mod(x, y));
    }
    return 0;
}

int pow_mod(int x, int y)
{
    x = (__int64)x;
    __int64 ans = 1 , base = x;
    if(!y)
        return 1;
    while(y)
    {
        if(y & 1)
            ans = ans * x % 99991;
        x = x * x % 99991;
        y >>= 1;
    }
    return (int)ans;
}

 

posted @ 2014-02-20 17:48  AHU_树  阅读(290)  评论(0编辑  收藏  举报