数论——欧拉定理
Posted nelson992770019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论——欧拉定理相关的知识,希望对你有一定的参考价值。
今天摸鱼看到一道题:
这不就快速幂裸题吗??
然后一看数据范围:
???这个b的范围吓到我了
经过一番学习,原来这道题考察的是:
欧拉定理&扩展欧拉定理
证明略过,直接上结论:
(图源OI wiki)
那么这道题就是先处理出欧拉函数,再根据扩展欧拉求解即可。注意b要边输入边取模。
欧拉函数的处理方式:
类似于线性筛素数,看标程即可,很好理解。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll M=1e6+10; 5 ll ans[M],phi[M]; 6 ll cnt; 7 ll m,a,b; 8 void Eulersieve() 9 phi[1]=1; 10 for(ll i=2;i<=m;i++) 11 if(!phi[i]) 12 for(ll j=i;j<=m;j+=i) 13 if(!phi[j]) phi[j]=j; 14 phi[j]=phi[j]/i*(i-1); 15 16 17 18 19 ll read() 20 ll x=0,f=1; 21 char c=getchar(); 22 while(!isdigit(c)) 23 if(c==‘-‘) f=-1; 24 c=getchar(); 25 26 while(isdigit(c)) 27 x=x*10+c-‘0‘; 28 c=getchar(); 29 30 return x*f; 31 32 ll getb() 33 ll x=0,flag=0; 34 char c=getchar(); 35 while(!isdigit(c)) 36 c=getchar(); 37 38 while(isdigit(c)) 39 x=(x*10+c-‘0‘); 40 if(x>=phi[m]) 41 flag=1; 42 x%=phi[m]; 43 44 c=getchar(); 45 46 if(x>=phi[m]) 47 flag=1; 48 x%=phi[m]; 49 50 return flag==1?x+phi[m]:x; 51 52 ll qp(ll n,ll p) 53 ll res=n,ans=1; 54 while(p) 55 if(p&1) 56 ans=(res*ans)%m; 57 58 res=(res*res)%m; 59 p>>=1; 60 61 return ans; 62 63 int main() 64 a=read(); 65 m=read(); 66 Eulersieve(); 67 b=getb(); 68 printf("%lld",qp(a,b)); 69 return 0; 70
以上是关于数论——欧拉定理的主要内容,如果未能解决你的问题,请参考以下文章