2020牛客NOIP赛前集训营-普及组(第二场)C-涨薪

it2026-06-06  3

这是一题快速幂,及坑人题。


题目


快速幂: 设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); }
最新回复(0)