【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;
}
然后在做乘法的时候一边取模就可以了。
【代码】
#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\n",b,p,k,a); //最后输出a就可以了。 } int main() { input_data(); ge_t(p); output_ans(); return 0; }