取余运算(分治)

描述

输入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

限制

时间限制: 1000 ms

内存限制: 65536 KB

 

一点自己关于使用分治算法的两种题型的小总结:1.如果题目中有一个范围,则一般递归时取n/2来将范围分解为小范围来,比如这题,范围p,递归传p/2;2.如果没有范围,则转换思考小规格的情况,然后再放大n倍去做,这样的话,一般可以找到一些规律,比如汉诺塔问题,递归时取n-1,再比如黑白棋子的移动,递归时取n-1。

此外,其实做了几个题目后,我对于分治与递归有什么区别产生了疑惑,感觉差不多啊,那为什么要分两种算法思想。我查了些资料,看了这个回答(第二个人的回答),感觉似懂非懂,还是多刷题吧。

#include 
#include 
using namespace std;
long long b, p, k;

int div (int m) {
	int res;
	if (m == 0) {
		return 1;
	}
		res = div(m/2)%k;
		res = (res * res) % k;
	if (m % 2 ==1) {
		res = (res * b) % k;
	}
	return res;	
}


int main()
{
    scanf ("%lld %lld %lld", &b, &p, &k);
	printf ("%lld^%lld mod %lld=%lld", b, p, k, div(p));
    return 0;
}

 

你可能感兴趣的:(#分治,#递归,数据结构与算法)