Time Limit: 1 Sec Memory Limit: 128 Mb
Description
给你三个整数a,b,p,求ab mod p的值
Input
第一行是一个整数t,表示t组数据。
接下来的n行,每行有 3 个整数,分别表示a, b, p
t ≤ 2 * 105,a > 0, b > 0, p ≥ 2,
Output
每组数据,输出一个整数表示答案。
Sample Input
2 2 10 9 2 3 3
Sample Output
7 2
代码实现
#include<stdio.h>
#define ll long long
/*
找出第一个幂>=2时a^i%p==a%p的次幂
然后用原来的幂b%i
*/
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
ll a, b, p;
scanf("%lld%lld%lld", &a, &b, &p);
ll mod = a % p;
int cnt = 1;
for (int i = 2; i <= b; i++)
{
mod = (mod * (a % p)) % p;
if (mod == a % p)
break;
cnt++;
}
b %= cnt;
if (b == 0)b = cnt;
mod = 1;
for (int i = 1; i <= b; i++)
{
mod = mod * (a % p) % p;
}
printf("%lld\n", mod);
}
}
#include<stdio.h>
#define ll long long
/*
a^b%p == (a^(b/2)%p*a^(b/2)%p)%p
初始化ret为1,表示最终的结果。
进行循环,条件为b不为0。
在每次循环中,将b右移1位(相当于将b除以2)。
将a的平方对p取模,即a = 1LL * a * a % p。
如果b的最低位为1(即b & 1为真),则将ret乘以a,再对p取模,即ret = 1LL * ret * a % p。
循环结束后,ret即为所求的结果。
*/
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
ll a, b, p;
scanf("%lld%lld%lld", &a, &b, &p);
int ret = 1;
for (; b; b >>= 1, a = 1LL * a * a % p)
if (b & 1) ret = 1LL * ret * a % p;
printf("%d\n", ret);
}
}