分治2--取余运算

分治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 } 

原文地址:https://www.cnblogs.com/Renyi-Fan/p/7135641.html