暑假集训Day1 B(拓展欧拉定理)_i++

 

这题公式其实非常好推,主要是在幂的指数上取模的时候,应该用欧拉定理,指数上模的应该是MOD对应的欧拉函数值

1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MOD=1e9+7;
5 const int MAX=2e5+5;
6 LL ans,n,a[MAX],b[MAX],c[MAX];
7 LL ksm(LL x,LL y){
8 LL an=1ll;
9 while (y){
10 if (y%2==1ll) an=(an*x)%MOD;
11 x=(x*x)%MOD;
12 y/=2ll;
13 }
14 return an;
15 }
16 LL ksm2(LL x,LL y){
17 LL an=1ll;
18 while (y){
19 if (y%2==1ll) an=(an*x)%(MOD-1);
20 x=(x*x)%(MOD-1);
21 y/=2ll;
22 }
23 return an;
24 }
25 inline LL read(){
26 LL an(0ll),x=1ll;char c=getchar();
27 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
28 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
29 return an*x;
30 }
31 bool cmp(LL x,LL y){
32 return x<y;
33 }
34 int main(){
35 freopen ("b.in","r",stdin);
36 freopen ("b.out","w",stdout);
37 int i,j;
38 LL x,y,z,mul=1ll;
39 n=read();
40 for (i=1;i<=n;i++) a[i]=read();
41 sort(a+1,a+n+1,cmp);
42 memset(b,0,sizeof(b));
43 memset(c,0,sizeof(c));
44 for (i=1;i<=n;i++)
45 if (a[i]!=a[i-1]){
46 b[++b[0]]=a[i];
47 c[++c[0]]=1;
48 }
49 else c[c[0]]++;
50 ans=1ll;bool flag=true;
51 for (i=1;i<=c[0];i++){
52 mul=(mul*(c[i]+1))%(MOD-1);
53 if ((c[i]+1)%2==0 && flag){
54 flag=false;
55 mul/=2;
56 }
57 }
58 for (i=1;i<=b[0];i++){
59 x=c[i];
60 if (flag) x/=2ll;
61 z=(x*mul%(MOD-1))%(MOD-1);
62 ans=(ans*ksm(b[i],z))%MOD;
63 }
64 printf("%lld",ans);
65 return 0;
66