九度OJ1085

时间:2014-03-05 17:50:12   收藏:0   阅读:526

      说起这个题呢,就不得不提一种快速求解幂的算法——反复平方法,可以在O(logn)的复杂度完成求幂运算。具体思路我不说,巫泽俊大神翻译的《挑战程序设计竞赛》P123对此有详细描述。

      但仅知道这个算法并不表示就能算出这道题,还需要一定的数学推理过程:

      N=a0+a1*k+a2*k^2+……an*k^n

      N‘=a0+a1+a2+……+an

      N-N‘=a1*(k-1)+a2*(k-1)^2+a3*(k-1)^3+......+an*(k-1)^n

      (N-N‘)%(k-1)=0

      (N‘-N‘‘)%(k-1)=0

     .....

      (N(r-1)-N(r))%(k-1)=0

      相加得(N-N(r))%(k-1)=0

      N(r)=N%(k-1)

      故(x^y)%(k-1)就是我们要求的。

      当(x^y)%(k-1)=0时,注意结果为k-1

      

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include<stdlib.h>
typedef long long ll;
ll x,y,k;
ll mod_pow(ll a,ll n,ll mod)
{
    ll res=1;
    while(n>0)
    {
        if(n&1)res=res*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return res;
}
int main()
{
    while(scanf("%lld%lld%lld",&x,&y,&k)!=EOF)
    {
    ll num=mod_pow(x,y,k-1);
    if(num==0)
    printf("%lld\n",k-1);
    else
    printf("%lld\n",num);
    }
    return 0;
}

  

九度OJ1085,布布扣,bubuko.com

原文:http://www.cnblogs.com/wickedpriest/p/3581359.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!