问题 I: 涨薪
题目描述
公司中总共有n个人,其中第i个人的初始工资为ai。公司根据每个人的绩效(工作表现)来评定每个人的涨薪幅度。每年有x个人绩效为A,工资可以变为原来的3倍;y个人绩效为B,工资可以变为原来的2倍,其余人绩效为C,
工资不变,连续两年绩效为C会被开除。(保证x+y≤n)
假如公司没有一直招聘新员工,请问m年后,公司需要给所有在职员工支付的工资总和最多为多少。由于答案可能很大,请输出对109+7取模后的结果。
输入
输入第一行包含四个正整数n,m,x,y,意义如题面所示。
接下来一行包含n个正整数,第i个正整数为ai代表第i个人的初始工资。
输出
输出一行一个整数表示m年后工资总和对109+7取模后的结果。
样例输入 Copy
【样例1】
2 1 1 1
5 3
【样例2】
2 2 0 0
5 2
样例输出 Copy
【样例1】
21
【样例2】
0
提示
对于20%的数据范围,满足n≤10,m≤10,ai≤10
对于40%的数据范围,满足n≤105,m≤10,ai≤105
对于另外20%的数据范围,满足n≤105,m≤10,ai≤105且x+y=n
对于另外20%的数据范围,满足n≤105,m≤109,ai≤105且x+y=n
对于100%的数据范围,满足1≤n≤105,1≤m≤109,1≤ai≤105
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll ;
const ll N=100010;
const int t=1e9+7;
ll a[N];
long long int qmi(long long int m, long long int k,long long int p)
{
long long int ans=1%p,t=m;
while (k)
{
if (k&1) ans = ans * t % p;
t = t * t % p;
k >>= 1;
}
return ans;
}
bool cmp(ll l,ll r)
{
return l>r;
}
int main()
{
ll n,m,x,y;
cin>>n>>m>>x>>y;
ll sum=0;
for(ll i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1,cmp);
for(ll i=1;i<=x;i++)
{
a[i]=a[i]*qmi(3,m,1e9+7);
}
for(ll i=x+1;i<=x+y;i++)
{
a[i]=a[i]*qmi(2,m,1e9+7);
}
if(m>=2)
{
for(ll i=1;i<=x+y;i++)
sum=(sum+a[i])%t;
}
else
{
for(ll i=1;i<=n;i++)
sum=(sum+a[i])%t;
}
cout<<sum;
return 0;
}