博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5171 GTY's birthday gift 矩阵快速幂
阅读量:5058 次
发布时间:2019-06-12

本文共 2111 字,大约阅读时间需要 7 分钟。

题目链接:

hdu:

bc(中文): 

题意:

给你初始的一堆数,每次从中找出两个最大的数相加再加入其中,求最后这n+k个数的和

题解:

初始堆中最大的两个数和后面的k个数会构成一个类似斐波那契数列。因此后面的和可用递推来求,由于k比较大,所以吧递推公式写成矩阵形式,用快速幂加速。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 7 const int maxn = 101010; 8 const int mod = 10000007; 9 typedef long long LL;10 11 struct Matrix {12 int n, m;13 int val[11][11];14 Matrix(int n, int m) :n(n), m(m) {}15 Matrix() {}16 void init(int n, int m) { this->n = n; this->m = m; }17 friend Matrix operator *(const Matrix& mat1, const Matrix& mat2) {18 Matrix ret(mat1.n, mat2.m);19 for (int i = 0; i < ret.n; i++) {20 for (int j = 0; j < ret.m; j++) {21 ret.val[i][j] = 0;22 for (int k = 0; k < mat1.m; k++) {23 ret.val[i][j] += (LL)mat1.val[i][k] * mat2.val[k][j] % mod;24 ret.val[i][j] %= mod;25 }26 }27 }28 return ret;29 }30 };31 32 void power(Matrix& mat, int n, Matrix& ans) {33 while (n) {34 if (n & 1) ans = mat*ans;35 mat = mat*mat;36 n /= 2;37 }38 }39 40 int arr[maxn];41 int n, k;42 Matrix mat, ans;43 44 void init() {45 mat.init(3, 3);46 mat.val[0][0] = 1; mat.val[0][1] = 1; mat.val[0][2] = 1;47 mat.val[1][0] = 0; mat.val[1][1] = 1; mat.val[1][2] = 1;48 mat.val[2][0] = 0; mat.val[2][1] = 1; mat.val[2][2] = 0;49 ans.init(3, 1);50 ans.val[0][0] = arr[n - 2] + arr[n - 1];51 ans.val[1][0] = arr[n - 1];52 ans.val[2][0] = arr[n - 2];53 }54 55 int main() {56 while (scanf("%d%d",&n,&k)==2&&n>1) {57 for (int i = 0; i < n; i++) scanf("%d", arr + i);58 sort(arr, arr + n);59 LL sum = 0;60 for (int i = 0; i < n - 2; i++) {61 sum += arr[i]; sum %= mod;62 }63 init();64 power(mat,k, ans);65 sum = (sum + ans.val[0][0]) % mod;66 printf("%d\n", sum);67 }68 return 0;69 }

 

转载于:https://www.cnblogs.com/fenice/p/5438650.html

你可能感兴趣的文章
同一个Controller里的同一个Service实例,在当前的Controller里的不同方法中状态不一致...
查看>>
Java多线程-线程池
查看>>
采集网站特殊文件Meta信息
查看>>
DRF分页组件
查看>>
.NET基础操作回顾_使用ADO.NET操作SqlServer使用的类
查看>>
React中redux表单编辑
查看>>
uCGUI 驱动LCD提速 STM32F主芯
查看>>
response.setContentType()的作用及参数
查看>>
rabbitmq 死信邮箱配置(dead-letter)
查看>>
注入 Istio sidecar
查看>>
解决SQLServer数据库"因为它正用于复制"的错误!
查看>>
【Python】- 第一行跟第二行的写法
查看>>
Rotate List - LeetCode
查看>>
maven没有servlet(创建servlet后报错)
查看>>
域对象 request
查看>>
高可用之KeepAlived(2):keepalived+lvs
查看>>
LazyManage中文注释学习版
查看>>
JSJ——主数据类型和引用
查看>>
Alpha 冲刺 (8/10)
查看>>
Web网页安全色谱
查看>>