C:涨薪
贪心加快速幂。
每次选最大的x个人涨薪3倍,其次y个人涨薪2倍,特判下m<2的时候把其他人的薪水加上即可,如果大于2就是0。
最后答案就是前X人的和乘以3^m+X人后的y个人的和乘以2^m加上特判的薪水。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2555555; inline ll read(){ ll s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&&c<='9'){ s=(s<<1)+(s<<3)+(c^48);c=getchar(); } return f*s; } bool vis[555]; ll n,a[N]; const int mod=1e9+7; ll ksm(ll x,ll y){ ll s=1; while(y){ if(y%2==1)s=(s*x)%mod; y/=2; x=(x*x)%mod; } return s; } bool cmp(ll a,ll b){ return a>b; } ll s1,s2,ans; int main(){ ll n=read(),m=read(),x=read(),y=read(); for(int i=1;i<=n;i++){ a[i]=read(); } sort(a+1,a+1+n,cmp); for(int i=1;i<=x;i++){ s1=(s1+a[i])%mod; } for(int i=x+1;i<=x+y;i++){ s2=(s2+a[i])%mod; } ll ans=(s1*ksm(3,m)%mod+s2*ksm(2,m)%mod)%mod; if(m<2){ for(int i=x+y+1;i<=n;i++){ ans=(ans+a[i])%mod; } } cout<<ans%mod; return 0; }