2020牛客NOIP赛前集训营-普及组(第二场)C涨薪
涨薪
https://ac.nowcoder.com/acm/contest/7606/C
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; }