【欧拉降幂+思维】 Multipliers
题面:Codeforces Round #338 (Div. 2) D Multipliers
题意:给出n个质数(n<=2e5),每个质数都<=2e5,求这n个质数的乘积的所有因子之积。
思路:
首先,这个乘积的每个因子肯定能够分解质因子,因此每个因子相当于是在给定的n个质数中任选k(1<=k<=n)个相乘得到。但是我们不可能枚举每一种选法,因此采取dp(递推),考虑每一个质数对于答案的贡献。
然后,具体怎么递推懒得写了 麻烦的一比 有兴趣的评论抠1 我再考虑补一下
#include<bits/stdc++.h>
#define ll long long
#define mem(b,t) memset(b,t,sizeof(b))
#define INF 0x3f3f3f3f
#define rep(i,n,m) for(int i=n;i<=m;i++)
#define per(i,n,m) for(int i=n;i>=m;i--)
#define bug1(i) cout<<i<<endl
#define bug2(i,j) cout<<i<<" "<<j<<endl
#define mod 1000000007
#define maxn 200050
#define eps 1e-6
#define pi acos(-1)
using namespace std;
int num[maxn];
ll ksm(ll base,ll power){
ll result=1;
while(power>0){
if (power&1){
result=result*base%mod;
}
power>>= 1;
base=(base%mod*(base%mod))%mod;
}
return result;
}
int main(){
int n;
cin>>n;
rep(i,1,n){
int x;
cin>>x;
num[x]++;
}
ll ans=1,cnt=1;
rep(i,2,200000){
if(!num[i]) continue;
ll now=1,t=ksm(1ll*i,cnt),tt=ans;
rep(j,1,num[i]){
tt=(tt*t)%mod;
now=(now*tt)%mod;
}
//这里%(mod-1)用到了欧拉降幂 因为cnt作为指数会很大 (欧拉降幂想学的抠2 我就补
cnt=cnt*(num[i]+1)%(mod-1);
ans=ans*now%mod;
}
cout<<ans%mod<<endl;
return 0;
}