这是一题快速幂,及坑人题。
题目
解
快速幂: 设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
);
}