数论——欧拉定理

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 

以上是关于数论——欧拉定理的主要内容,如果未能解决你的问题,请参考以下文章

数学数论初探欧拉定理

「数论基础」欧拉定理(费马小定理)

数论——欧拉定理

数论之欧拉定理

初等数论四大定理欧拉定理,费马小定理

欧拉定理拓展欧拉定理及其应用(欧拉降幂法)