大数幂运算 指数太大的时候 我们需要进行降幂操作
首先呢 认识欧拉定理之前 先了解一下欧拉函数 链接 欧拉函数
欧拉定理
我们将欧拉函数写作
欧拉定理就是 a n为正整数 且 a n 互质 那么 (mod n)
那么根据欧拉定理的式子 我们可以转化为 %n
1
那么既然 在mod n的情况下 恒等于 1
那么就得到了我们用来降幂的公式 (mod n)
扩展欧拉定理
扩展呢就是把互质推广到所有情况嘛
如果欧拉定理中的 a n不互质了 则有如下公式
降幂
如果a n互质 我们就根据欧拉定理降幂
(mod n)
如果不互质 我们就根据扩展欧拉定理降幂
我们在求 % n 的时候 可以通过判断
来转成上面的两个式子之一
就完成降幂了
练习题目的话
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
const int mod=1e9+7;
char a[maxn],b[maxn];
ll pow_mod(ll x,ll n){
ll ans=1;
x=x%mod;
while(n!=0){
if(n&1)
ans=ans*x%mod;
n>>=1;
x=x*x%mod;
}
return ans;
}
int main(){
//先通过欧拉函数 计算出mod 的欧拉函数是 1000000006 也就是mod-1
scanf("%s%s",a,b);
int l=strlen(a);
ll n=0;
for(int i=0;i<l;i++){
n=(n*10+a[i]-'0')%(mod-1);//所以这里使用 mod-1 降幂
}
printf("%lld\n",pow_mod(2,n));
return 0;
}