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;
}
然后在做乘法的时候一边取模就可以了。
【代码】
#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;
}