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

Posted MichaelZona

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假集训Day1 B(拓展欧拉定理)相关的知识,希望对你有一定的参考价值。

暑假集训Day1

 

这题公式其实非常好推,主要是在幂的指数上取模的时候,应该用欧拉定理,指数上模的应该是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

 

以上是关于暑假集训Day1 B(拓展欧拉定理)的主要内容,如果未能解决你的问题,请参考以下文章

暑假集训Day1 A(gcd)

拓展欧拉定理及其应用

暑假集训day1

Luogu4139 上帝与集合的正确用法 拓展欧拉定理

2021年SWPUACM暑假集训day1二分算法

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