问题描述:
输入正整数a、n和m,输出的值。
方法一:依此乘以a并取模
#include<iostream>
#include<cstdio>
using namespace std;
int pow_mod(int a, int n, int m){
int ans = 1;
for (int i = 0; i < n; i++)ans = (int)((long long)ans * a % m);
return ans;
}
int main()
{
int a, n, m;
scanf("%d%d%d",&a,&n,&m);
printf("%d\n",pow_mod(a,n,m));
system("pause");
return 0;
}
方法二:分治法
由于每次都要乘以a,所以可以分为左右两部分,分别求出左右两部分的幂取模,然后再合并两部分的幂取模。
算法流程如下:
程序实现如下:
#include<iostream>
#include<cstdio>
using namespace std;
int pow_mod(int a, int n, int m){
if (n == 1) return a%m;
int newn = n / 2;
int x=pow_mod(a, newn, m);
long long ans = (long long)x*x%m;
if (n % 2)ans = ans*a%m;
return ans;
}
int main()
{
int a, n, m;
scanf("%d%d%d",&a,&n,&m);
printf("%d\n",pow_mod(a,n,m));
system("pause");
return 0;
}