可以二分求方,或者根据二进制信息来求就更快了! 请看看:package naiti;import java.util.Scanner;public class PractiseB { private static final int m = 9907; public static void main(String[] args) { // System.out.println((long)Math.pow(2, 31)); Scanner sc = new Scanner(System.in); int testNum = sc.nextInt(); for (int i = 0; i < testNum; ++i) { int a = sc.nextInt(); int b = sc.nextInt(); //求a^b int x = 0; long sum = 1; for (x = bitLen(b); x > 0; --x) { sum = (sum * sum) % m; if (bitAt(b, x) > 0) sum = (sum * a) % m; } System.out.println(sum); } } static int bitLen(int x) { int d = 0; while (x > 0) { x >>= 1; d++; } return d; } static int bitAt(int x, int i) { return (x & (1 << (i - 1))); } }
if (exponent < 0)
return 1 / pow(base, -exponent);
double power = 1;
while(exponent > 0) {
if((exponent & 1) == 1) {
power *= base;
}
base *= base;
exponent >>= 1;
}
return power;
}时间复杂度 O(lgN)
请看看:package naiti;import java.util.Scanner;public class PractiseB {
private static final int m = 9907; public static void main(String[] args) { // System.out.println((long)Math.pow(2, 31));
Scanner sc = new Scanner(System.in);
int testNum = sc.nextInt();
for (int i = 0; i < testNum; ++i) {
int a = sc.nextInt();
int b = sc.nextInt();
//求a^b
int x = 0;
long sum = 1;
for (x = bitLen(b); x > 0; --x) {
sum = (sum * sum) % m;
if (bitAt(b, x) > 0)
sum = (sum * a) % m;
}
System.out.println(sum);
}
} static int bitLen(int x) {
int d = 0;
while (x > 0) {
x >>= 1;
d++;
}
return d;
} static int bitAt(int x, int i) {
return (x & (1 << (i - 1)));
}
}