次方求模
时间限制: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%n=((a%n)*(b%n))%n(a+b)%n=((a%n)+(b%n))%n
(a-b)%n=((a%n)-(b%n)+n)%n
01.
#include<stdio.h>
02.
int
pow
(
int
m,
int
n,
int
p) //递归找最简式
03.
{
04.
if
(n==0)
return
1%p;
05.
int
temp=
pow
(m,n>>1,p); //二进制数向后移一位,等价于十进制数n/2
06.
temp=(
long
long
)temp*temp%p;
07.
if
(n&1) temp=(
long
long
)temp*m%p; //与一相与 ,判断奇偶性,强制类型转换成long long型
08.
return
temp;
09.
}
10.
int
main()
11.
{
12.
int
n;
13.
scanf
(
"%d"
,&n);
14.
while
(n--)
15.
{
16.
int
a,b,c,s=1,t;
17.
scanf
(
"%d %d %d"
,&a,&b,&c);
18.
printf
(
"%d\n"
,
pow
(a,b,c));
19.
}
20.
return
0;
21.
}