【题解】C-涨薪(7606. 2020牛客NOIP赛前集训营-普及组(第二场))
涨薪
https://ac.nowcoder.com/acm/contest/7606/C
考场上写了两种解法,结束后发现最后交的是错误代码...
提交记录
思路
分析
当
时,会有
名员工被辞退,需要计算以下内容:
当
时,没有员工被开除,需要计算以下内容:
如果纯暴力的话复杂度是 所以用快速幂优化下,就变成了
代码模板
快速幂板子(带mod版本):
long long binpow(long long a, long long b, long long mod) {
a %= mod;
long long res = 1;
while (b > 0) {
if (b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
} 代码
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
bool cmp(int a, int b) {
return a > b;
}
long long binpow(long long a, long long b) {
a %= mod;
long long res = 1;
while (b > 0) {
if (b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main() {
long long n, m, x, y, a[100005], ans = 0;
cin >> n >> m >> x >> y;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n, cmp);
for (int j = 0; j < x; j++) {
a[j] *= binpow(3, m);
}
for (int j = x; j < x + y; j++) {
a[j] *= binpow(2, m);
}
for (int i = 0; i < x + y; i++) {
ans += a[i];
ans %= mod;
}
if (m < 2) {
for (int i = x + y; i < n; i++) {
ans += a[i];
ans %= mod;
}
}
cout << ans << endl;
return 0;
} 