码迷,mamicode.com
首页 > 其他好文 > 详细

【数论】——欧拉定理

时间:2019-09-13 17:34:27      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:今天   std   就是   info   wiki   根据   范围   getch   dig   

今天摸鱼看到一道题:

技术图片

 

 这不就快速幂裸题吗??

然后一看数据范围:

技术图片

 

 ???这个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 }

【数论】——欧拉定理

标签:今天   std   就是   info   wiki   根据   范围   getch   dig   

原文地址:https://www.cnblogs.com/Nelson992770019/p/11517149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!