Title

欧拉降幂

欧拉降幂

最终公式

\[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;
}

posted @ 2023-09-03 16:24  是胡某某啊  阅读(28)  评论(0)    收藏  举报