对于大指数幂的处理

来源:互联网 发布:软件源代码查看器 编辑:程序博客网 时间:2024/06/05 16:33

对于大指数幂的处理

一点数论入门知识

打比赛的时候我们经常遇到一个特别大的指数,下面我讲一下通常的处理方式

首先用到一个定理:欧拉定理 这里写图片描述 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() {    ///也不算很暴力的 o(nlog(n))解法  44s(滑稽)    ll f=7;    for(int i=1;i<=66666666;i++){        f=fpow(f,i);    }    cout<<f<<endl;    ///  费马小定理解法 o(n)    ll ans=1;    for(int i=1;i<=66666666;i++){        ans=(ans*i)%(mod-1);    }    cout<<fpow(7,ans);    return 0;}///  来自滑稽的问候
原创粉丝点击