http://ac.jobdu.com/problem.php?pid=1085 求root(N, k)
/*
N =a0+a1*k+a2*k^2+......ar*k^r;
N'=a0+a1 +a2 +......ar;
N-N' = a1(k-1)+a2(k^-1)+......+ar(k^r-1)
右边提取k-1,可以得出结论:
(N-N')%(k-1)=0
这样递推下去,
(N-N')%(k-1)=0
(N'-N'')%(k-1)=0
....
(N(r-1)-N(r))%(k-1)=0
直到N(r) < k
所有式子相加(N - N(r))%(k-1)=0,N(r)是我们要求的结果...
注意是求x^y%(k-1),如果x^y%(k-1)==0,则输出k-1,否则输出x^y%(k-1)
*/
#include<iostream>
#include<cstdio>
using namespace std;
inline long long mod_exp(long long x,long long y,int mod) //快速二分求幂(x^y)%mod
{
long long ans=1;
while(y)
{
if(y&1)
{
ans*=x;
if(ans>=mod)
ans%=mod;
}
x*=x;
if(x>=mod)
x%=mod;
y>>=1;
}
return ans;
}
int main(void)
{
int k;
long long x,y,temp;
while(scanf("%lld %lld %d",&x,&y,&k)!=EOF)
{
temp = mod_exp(x,y,k-1);
if(temp == 0)
printf("%lld\n",k-1);
else
printf("%lld\n",temp);
}
return 0;
}
本文介绍了一种求解root(N,k)的算法实现,通过递推公式和快速二分求幂的方法,解决了给定N和k时,求N在k进制下各位数之和的过程直至N小于k的问题,并提供了完整的C++代码实现。
928

被折叠的 条评论
为什么被折叠?



