2020牛客NOIP赛前集训营-普及组(第二场)C涨薪
快排加快速幂,无视辞退者,比赛的时候没想到加快速幂,直接60分……没关系,想到加快速幂也写不出来
真没什么好说的,唯一需要注意的就是快速幂运算时模,防爆longlong
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
ll n,m,x,y,s=0,a[100001],xx=0,yy=0;
bool cmp(ll a,ll b)
{
return a>b;
}
void ksm()
{
ll xxx=3,yyy=2;
while(m)
{
if(m&1)
{
xx=(xx*xxx)%mod;
yy=(yy*yyy)%mod;
}
xxx=(xxx*xxx)%mod;
yyy=(yyy*yyy)%mod;
m/=2;
}
return;
}
int main()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);//从大到小排序
if(m==1)//一年特判
{
for(int i=1;i<=x;i++)s=(s+a[i]*3)%mod;
for(int i=x+1;i<=x+y;i++)s=(s+a[i]*2)%mod;
for(int i=x+y+1;i<=n;i++)s=(s+a[i])%mod;
cout<<s;
return 0;
}
for(int j=1;j<=x;j++)xx=(xx+a[j])%mod;
for(int j=x+1;j<=x+y;j++)yy=(yy+a[j])%mod;
ksm();//快速幂
cout<<(xx+yy)%mod;//一定要再模一次
return 0;
}


京公网安备 11010502036488号