大数幂运算   指数太大的时候  我们需要进行降幂操作

首先呢 认识欧拉定理之前 先了解一下欧拉函数      链接     欧拉函数

欧拉定理

我们将欧拉函数写作    

欧拉定理就是  a n为正整数 且 a  n  互质   那么 (mod  n)

那么根据欧拉定理的式子  我们可以转化为  %n 1  

那么既然 在mod n的情况下  恒等于 1  

那么就得到了我们用来降幂的公式     (mod n)

扩展欧拉定理

扩展呢就是把互质推广到所有情况嘛
如果欧拉定理中的 a n不互质了  则有如下公式

降幂

如果a n互质  我们就根据欧拉定理降幂

                 (mod n)

如果不互质   我们就根据扩展欧拉定理降幂

                  我们在求 % n  的时候 可以通过判断  来转成上面的两个式子之一

就完成降幂了

练习题目的话

牛客寒假算法基础集训营4 E题

代码

#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;
}