这是一题快速幂,及坑人题。
题目
解
快速幂:
设c(p,n)为p的n次方,得
当p为偶数:c(p,n)=(p,n/2)^2
当p为奇数:c(p,n)=(p,n/2)^2*p
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long mo = 1000000007;
long long n,m,x,y,a[1000010],sum1,sum2,sum3,c3,c2,ans;
long long c(long long k, long long cf){
if(cf == 1) return k;
if(cf == 0) return 1;
long long lll = c(k,cf/2);
lll = lll * lll % mo;
if(cf % 2 == 0) return lll;
return lll * k % mo;
}
bool cmp(long long aa, long long bb){
return aa>bb;
}
int main(){
scanf("%lld%lld%lld%lld", &n, &m, &x, &y);
for(long long i = 1; i <= n; ++i)
scanf("%lld", &a[i]);
sort(a+1, a+1+n, cmp);
for(long long i = 1; i <= min(x,n); ++i)
sum1 = (sum1 + a[i]) % mo;
for(long long i = x + 1; i <= min(x + y, n); ++i)
sum2 = (sum2 + a[i]) % mo;
for(long long i = x + y + 1; i <= n; ++i)
sum3 = (sum3 + a[i]) % mo;
c3 = c(3,m);
c2 = c(2,m);
if(m >= 2)
ans = (sum1 * c3 % mo + sum2 * c2 % mo) % mo;
else ans = (sum1 * c3 % mo + sum2 * c2 % mo + sum3) % mo;
printf("%lld", ans);
}