欧拉降幂
欧拉降幂
最终公式
\[a^{\Tiny n}\normalsize\equiv
\begin {cases}
a^n\ (mod\ m) , &\text{(n<2$\varphi$(m))}\\
a^{n\ mod \ \varphi(m)+\varphi(m)}\ (mod\ m) &\text{(n$\geq$2$\varphi$(m))}
\end {cases}\]
\(\varphi(m)\)是\(m\)的欧拉函数
n是一个极大的指数(可以是\(10^{100}\)等,也就是求\(2^{10^{100}}\)这种大指数快速幂也不能快速求解)
m是一个常数,可以不一定是素数
有了这个等价结果,指数可以降到\(2\varphi(m)\)以内,进而可以使用快速幂。
预备知识
费马小定理
若\(p\)为素数,则有\(a^n\equiv a^{n\ mod\ (p-1)}\ (mod\ p)\)
Concept-既约剩余代表系
\(\forall p \in Z\)
设集合\(A=\{a_1,a_2,a_3\dots,a_{p-1}\}\)
若A满足
\[\begin{cases}
\forall m\in Z且gcd(m,p)=1,\exists x\in A,x≡m(mod p)\\
\forall a,b\in Z,gcd(a,b)=1\\
\end{cases}\]
接下来不作具体证明 我也不会
样题——sum
题目:
给定一个数字\(N\),\(N\)可能大到\(10^{1000000}\),即\((1\leq N\leq10^{1000000})\)。求\(2^{N-1}\ mod\ 10^{9}+7\)
输入输出:
Sample Input | Sample Output |
---|---|
2 | 2 |
题解
\(10^{9}+7\)是一个素数,可以利用费马小定理得到\(2^{N-1}\equiv 2^{(N-1)\ mod\ (10^{9}+7-1)}\ (mod\ 10^{9}+7)\)
那么只需要求\((N-1)\ mod\ (10^{9}+7-1)\),然后再用快速幂求解,就可以解出来了。\(N\)很大,需要用大整数的模法。
原题链接\(\Huge\leftarrow\)
点此查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
string s;
ll qpow(ll x, ll n){
ll res=1;
while(n){
if(n&1){
res=(x*res)%mod;
}
x=x*x%mod;
n>>=1;
}
return res;
}//快速幂 log(N)
ll fermat(string n){//费马小定理和字符串型大整数 (指数取模)
ll ans=0;
int len=n.size();
for(int i=0;i<len;i++){
ans=(ans*10+(n[i]-'0'))%(mod-1);//取p-1模
}
return ans;
}
int main(){
while(cin>>s)
{
cout<<qpow(2,fermat(s)-1)<<'\n';
}
return 0;
}