【9701】求余运算

Time Limit: 3 second
Memory Limit: 2 MB

【问题描述】

    输入b,p,k的值,求bp mod k的值。其中b、p、k*k为长整形数。

【输入格式】

    1行。先后为b、p、k的值,中间用空格隔开

【输出格式】

    仅1行。b^p mod k的结果值(mod的前后有一个空格,等号前后无空格)

【输入样例】

    2 10 9

【输出样例】

    2^10 mod 9=7

【题解】

首先得知道一个原理

就是 a * b mod k == (a % k) * (b %k) mod k;

但是b上面的指数p可能太大了。这样算的话可能会超时。

所以要用到快速幂。

介绍一下快速幂

eg:2^17

我们首先把17/2->8;

然后8/2 = 4

4/2 = 2

2/2 =1

1/2 = 0;

然后组合成((((2^0*2 )^2)^2)^2)^2*2。

这样看可能有点复杂。可以看下这个程序的过程

a最初为1

void kk (int x)

{
if (x == 0) return;

kk( x /2)

a*a;

if (x 为奇数)

 a*2;
}

把上面的2换成b就可以了。

然后在做乘法的时候一边取模就可以了。

【代码】

#include <cstdio>

int b,p,k,a = 1;

void input_data()
{
	scanf("%d%d%d",&b,&p,&k);//b^p mod k
}

void ge_t(int x) 
{
	if (x == 0) //如果等于0就跳出 
		return;
	ge_t(x >> 1); //相当于x/2 
	a = (a * a) % k; //相乘 注意取模 
	if ( (x % 2)== 1) //如果x为奇数还要再乘一个底数 
		a = ( a * (b %k)) %k;
}

void output_ans()
{
	printf("%d^%d mod %d=%d
",b,p,k,a); //最后输出a就可以了。 
}	

int main()
{
	input_data();
	ge_t(p);
	output_ans();
	return 0;
}	


原文地址:https://www.cnblogs.com/AWCXV/p/7632399.html