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

 这题公式其实非常好推,主要是在幂的指数上取模的时候,应该用欧拉定理,指数上模的应该是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 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/15008421.html