0
点赞
收藏
分享

微信扫一扫

子序列权值乘积 (排列组合 欧拉降幂 快速幂

westfallon 2022-02-09 阅读 51

添加链接描述
首先排序对结果不影响 然后先分析取最大值时,最小值类似
当取当前第i个数,那么这个数作为最大值,首先可以保证i+1~~n不取,所以取前1~i个数,那么可以发现有2^(i-1)可能取法 所以结果就是res=res*arr(i)2 ^n-1; 要采用欧拉降幂消指数
ab%p 当a与p互质时 b%=p-1;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+9;
ll q_pow(ll a,ll b,ll mod){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll arr[N],res=1;
int main(){
    int n;
    cin>>n;
    ll mod=1e9+7;
    for(int i=1;i<=n;i++)cin>>arr[i];
    sort(arr+1,arr+1+n);
    for(int i=1;i<=n;i++){
        res=res*q_pow((arr[i]),q_pow(2,i-1,mod-1)%mod,mod)%mod;
    }
    for(int i=1;i<=n;i++){
        res=res*q_pow((arr[i]),q_pow(2,n-i,mod-1)%mod,mod)%mod;
    }
    cout<<res<<endl;
    
    return 0;
}
举报

相关推荐

0 条评论