【快速幂取模】【AOJ-569】乘的更快
Description
上初中的时候我们就学会了幂乘运算,可是我们却不知道对于高阶的幂乘,出结果的方法比较慢,那么你有什么更好的方法吗?
Input
第1行,一个整数N(1<=N<=1000),表示要计算的数据组数
第2-N+1行,每行两个整数,第1个是x(1<=x<=100),表示底数,第2个是y(0<=y<=10000000),表示指数。
第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; }