对于大指数幂的处理
一点数论入门知识
打比赛的时候我们经常遇到一个特别大的指数,下面我讲一下通常的处理方式
首先用到一个定理:欧拉定理
a,p互质 或者他的简化形式 费马小定理
a,p互质
通常 n为素数所以两个定理是一样的。
示例 取 7^66666666! %1e9+7;
由费马小定理可知 7^1e9+6%1e9+7=1
所以 原式就变成了 7^(66666666!%1e9+6)%1e9+7,快速幂解决
#include <bits/stdc++.h>
#include <chrono>
#include <windows.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll fpow(ll a ,ll b){
ll ans=1;
while(b){
if(b&1)
ans=(ans*a)%mod;
a*=a;
a%=mod;
b>>=1;
}
return ans;
}
int main() {
ll f=7;
for(int i=1;i<=66666666;i++){
f=fpow(f,i);
}
cout<<f<<endl;
ll ans=1;
for(int i=1;i<=66666666;i++){
ans=(ans*i)%(mod-1);
}
cout<<fpow(7,ans);
return 0;
}