※清华大学 求root(N, k)(java)

题目描述
    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;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页