(分治)取余运算

题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入
输入b,p,k的值。
输出
求b^p mod k的值。
样例输入
2 10 9
样例输出
2^10 mod 9=7

余数公式:

a*b % n = (a % n)*(b % n) % n

b的p次方可以拆着来算,递推公式:
p==0 1
p/2==0 f(p)=f(p/2)*f(p/2)
p/2==1 f(p)=f(p/2)*f(p/2)*f(1)

f(x) 意思是b的x次方

 if(p==0) return 1;
 ll tmp=f(b,p/2,k);
 ll ans=((tmp%k)*(tmp%k))%k;
 if(p/2==1) ans=(ans*(b%k))%k;//如果等于1,拆开不了一半,还得乘一次b
 return ans;
#include 
#include 
#include 

using namespace std;


long int mod_fenzhi(long int b,long int p,long int k){
    if(p==1){
        return b%k;
    }
    if(p==2){
        return b*b%k;
    }
    if(p%2==0){
        long int aa=mod_fenzhi(b,p/2,k);
        return aa*aa%k;
    }
    if(p%2==1){
        long int aa=mod_fenzhi(b,p/2,k);
        return aa*aa*b%k;
    }
}

int main()
{
    long int b;
    long int p;
    long int k;
    long int jieguo;
    while(scanf("%ld %ld %ld",&b,&p,&k)!=EOF){
        jieguo=mod_fenzhi(b,p,k);
        printf("%ld^%ld mod %ld=%ld\n",b,p,k,jieguo);
    }
    return 0;
}

你可能感兴趣的:(acm练习(c++/c))