luogu P1405 苦恼的小明(欧拉定理)

题意

求a1^a2^a3^...^an(mod10007)n<=1000000,a[i]<=10000

题解

明眼人一眼就可以看出是欧拉定理的推论。

首先这个题是错的,没说保证互质。

然而我背错了定理,然后就一直减一。

之后发现要求phi,求完之后一直RE,交了题解还RE、、、

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=5000000;
 8 int phi[N],a[N],n,ans;
 9 void get_phi(){
10     phi[1]=1;
11     for(int i=2;i<=10010;i++)
12         if(!phi[i])
13         for(int j=i;j<=10010;j+=i)
14         {
15             if(!phi[j])phi[j]=j;
16             phi[j]=phi[j]/i*(i-1);
17         }
18 }
19 int ksm(int x,int b,int md){
20     int tmp=1;
21     x%=md;
22     while(b){
23         if(b&1){
24             tmp=(tmp*x)%md;
25         }
26         b>>=1;
27         x=(x*x)%md;
28     }
29     return tmp;
30 }
31 int dfs(int x,int md){
32     if(x==n)return a[n]%md;
33     int y=dfs(x+1,phi[md]);
34     return ksm(a[x],y,md);
35 }
36 int main(){
37     scanf("%d",&n);
38     for(int i=1;i<=n;i++){
39         scanf("%d",&a[i]);
40     }
41     get_phi();
42     printf("%d",dfs(1,10007)); 
43 }

 

posted @ 2018-08-31 08:45  Xu-daxia  阅读(266)  评论(0编辑  收藏  举报