题目描述
N<k时,root(N,k) = N,否则,root(N,k) = root(N',k)。N'为N的k进制表示的各位数字之和。输入x,y,k,输出root(x^y,k)的值 (这里^为乘方,不是异或),2=<k<=16,0<x,y<2000000000,有一半的测试点里 x^y 会溢出int的范围(>=2000000000)
输入描述:
每组测试数据包括一行,x(0<x<2000000000), y(0<y<2000000000), k(2<=k<=16)
输出描述:
输入可能有多组数据,对于每一组数据,root(x^y, k)的值
示例1
输入
复制
4 4 10
输出
复制
4
然后用到了快速幂取模
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
public static int res = 0;
public static void main(String[] args)
{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
try {
String str;
while((str=br.readLine())!=null) {
String[] parts = str.split(" ");
long x = Long.valueOf(parts[0]);
long y = Long.valueOf(parts[1]);
long k = Long.valueOf(parts[2]);
System.out.println(root(x, y, k));
}
} catch (IOException e) {
e.printStackTrace();
}
}
//快速幂取模
public static long root(long x, long y, long k) {
long ans = 1;
k--;
while(y > 0) {
if(y%2==1) ans = (ans*x)%k; // 二分求幂,并取模
y /= 2;
x = (x*x)%k; //取模
}
return ans==0?k:ans;
}
}