http://ac.jobdu.com/problem.php?pid=1085
我自己的方法是构造bigint数据类型,然后无脑循环乘求幂,然后再转换k进制,递归求解。这种做法的时间复杂度就不用说了,数据稍微一大一定超时。真正有效的做法代码很简单,却需要很强的数学知识和严格证明,自知达不到这个水平,果断引来大神的博客http://blog.sina.com.cn/s/blog_8619a25801010wcy.html快速幂取模。原文如下:
计算x^ymod n;如果采用常规方法,当x与y都比较小的情况下,采用直接计算可以,但是如果当x跟y都非常大的时候,如2^1000mod 100000,那该如何解决呢?
- #define LL long long int
- LL exp_mod( LL x , LL y , LL n ){
-
LL ret=1; -
while(y){ -
if(y&1) ret=(ret*x)%n; -
x=(x*x)%n; -
y=y>>1; -
} -
return ret; - }
-
#include <stdio.h>
-
#define LL long long int
-
LL exp_mod(LL x,LL y,LL n){
-
LL ret=1;
-
while
(y){
-
if
(y&1) ret=(ret*x)%n;
-
x=(x*x)%n;
-
y=y>>1;
-
}
-
return
ret;
-
}
-
-
int
main(){
-
LL a,b,k,ans;
-
-
while
(
scanf
(
"%lld%lld%lld"
,&a,&b,&k)==3){
-
ans=exp_mod(a,b,k-1);
-
if
(ans==0) ans=k-1;
-
printf
(
"%lld\n"
,ans);
-
}
-
return
0;
-
}
-----------Amazing Mathematics
注意,当我用int时,无法ac,改为long long才能ac,因为两个足够大的数在做乘法时,很可能溢出。数学的重要性,就不用我再说了吧,读研的时候好好加强数学背景吧。