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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值