分治2--取余运算
一、心得
二、题目和分析
题目描述
输入b,p,k的值,求bp mod k的值。其中b,p,k*k为长整型数。
输入
三个整数,分别为b,p,k的值
输出
bp mod k
样例输入
2 10 9
样例输出
2^10 mod 9=7
提示
解题思路:分治,顾名思义,把一个大问题分解为多个小问题。
这里有一个公式,利用这个公式通过递归求得。
三、代码和结果
1 /* 2 递推方程 3 边界 4 p==0 1 5 p/2==0 f(p)=f(p/2)*f(p/2) 6 p/2==1 f(p)=f(p/2)*f(p/2)*f(1) 7 */ 8 #include <iostream> 9 #define ll long long 10 using namespace std; 11 12 ll f(ll b,ll p,ll k){ 13 if(p==0) return 1; 14 else { 15 ll tmp=f(b,p/2,k); 16 ll ans=((tmp%k)*(tmp%k))%k; 17 if(p/2==1) ans=(ans*(b%k))%k; 18 return ans; 19 } 20 } 21 22 int main(){ 23 ll b,p,k; 24 cin>>b>>p>>k; 25 cout<<f(b,p,k)<<endl; 26 return 0; 27 }