时间限制:1秒
空间限制:65536K
热度指数:1082
算法知识视频讲解
题目描述
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
N=a0+a1*k+a2*k^2+a3*k^3……
N'=a0+a1+a2+a3……
N-N'=a1*(k-1)+a2*(k^2-1)+a3*(k^3-1)……
所以(N-N')%(k-1)=0;
同理(N'-N'')%(k-1)=0;
所以最后求得的Nr,满足(N-Nr)%(k-1)=0;
所以N%(k-1)=Nr%(k-1)
// pat.cpp : 定义控制台应用程序的
//#include "stdafx.h"
#include"stdio.h"
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
ll x,y;
int k;
ll cal(ll a,ll m){//注意这里都要是ll类型
ll sum=1;
while(m){//矩阵的快速幂求解,并取余
if(m&1)sum=sum*a%(k-1);
a=a*a%(k-1);
m>>=1;
}
return sum;
}
int main(){
//freopen("c://jin.txt","r",stdin);
while(cin>>x>>y>>k){
ll p=cal(x,y);
cout<<(p==0?k-1:p)<<endl;//如果p=0,说明取余以后是0,则是k-1
}
//freopen("CON","r",stdin);
//system("pause");
return 0;
}