以下截自百科:
快速幂顾名思义,就是快速算某个数的多少次幂。
其时间复杂度为 O(log2N), 与朴素的O(N)相比效率有了极大的提高。
以下以求a的b次方来介绍:
把b转换成2进制数
该2进制数第i位的权为a^(2^(i-1))
例如
a^11=a^(2^0+2^1+2^3)
11的二进制是1 0 1 1
11 = 2^3*1 + 2^2*0 + 2^1*1 + 2^0*1
因此,我们将a^11转化为算a^(2^0)*a^(2^1)*a^(2^3)
代码:
#include <stdio.h>
int pow (int a, int b)
{
int r = 1, base = a;
while(b != 0)
{
if(b % 2)
{
r *= base;
//printf("r = %d\n", r);
}
base *= base;
//printf("base = %d\n", base);
b /= 2;
}
return r;
}
int main (void)
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
printf("%d\n", pow(a, b));
}
return 0;
}
位运算:
#include <stdio.h>
/*
base一直自乘,等于a^1, a^2, a^4, a^8…………
如果b&1是1的话,就乘上base
是0就不乘
*/
int pow (int a, int b)
{
int r = 1, base = a;
while(b != 0)
{
if(b & 1)
{//b与0001相与就是取b二进制的最后一位数字
r *= base;
}
base *= base;
b >>= 1;//右移一位
}
return r;
}
int main (void)
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
printf("%d\n", pow(a, b));
}
return 0;
}
次方求模
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
求a的b次方对c取余的值
-
输入
-
第一行输入一个整数n表示测试数据的组数(n<100)
每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000)
输出
- 输出a的b次方对c取余之后的结果 样例输入
-
3 2 3 5 3 100 10 11 12345 12345
样例输出
-
3 1 10481
-
第一行输入一个整数n表示测试数据的组数(n<100)
这个题多了一步取模。
利用a * b % c = ((a % c) * b) % c
#include <stdio.h>
long long pow(long long a, long long b, long long c)
{
long long r = 1;
long long l = a;
while(b != 0)
{
if(b & 1)
{
r = r * l % c;
}
l = l * l % c;
b >>= 1;
//r %= c;
}
return r;
}
int main (void)
{
int n;
long long a, b, c;
scanf("%d", &n);
while(n --)
{
scanf("%lld %lld %lld", &a, &b, &c);
printf("%lld\n", pow(a, b, c));
}
return 0;
}