题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=5171

 


算法:  

  可以先将数组a[]排序,然后序列 a1 , a2 , … , an 即为有序序列,则第一次加入的就是 an + an-1 ,第二次就是 an + (an + an-1) ,如此循环就构成了斐波那契序列。

  设斐波那契序列的第k项为Fk,则可知第k次加入的即为 Fk+1 * an +  Fk * an-1

  设斐波那契序列的前k项和为Sk, 则所得结果res即为:a1 + a2 + … + an-1 + an + (Sk+1 - 1) * an + S* an-1

实现方法:

  由于需要对结果取余,所以可以考虑用矩阵快速幂来实现斐波那契序列,具体怎么实现可以看这里

  并且根据公式可以知道 Sk = 2 * Fk + Fk-1 - 1 , 代入上式即可。

  


#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
const int MOD = ;
const int maxn = + ;
const int N = ;
struct Mat {
LL mat[N][N];
} a;
void init()
{
a.mat[][] = a.mat[][] = a.mat[][] = ;
a.mat[][] = ;
}
Mat operator *(Mat a , Mat b)
{
Mat tmp;
memset(tmp.mat , , sizeof(tmp.mat));
for(int i = ; i < N ; i++)
for(int j = ; j < N ; j++)
for(int k = ; k < N ; k++)
tmp.mat[i][j] = (tmp.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
return tmp;
}
Mat operator ^(Mat a , int k)
{
Mat tmp;
for(int i = ; i < N ; i++)
for(int j = ; j < N ; j++)
tmp.mat[i][j] = (i == j);
while(k) {
if(k & )
tmp = tmp * a;
a = a * a;
k /= ;
}
return tmp;
}
LL Fib(int k)
{
Mat tmp;
tmp = a ^ k;
return tmp.mat[][];
}
LL a_[maxn];
int main()
{
init();
LL n , k , i , j , res;
while(~scanf("%lld %lld" , &n , &k))
{
for(i = , res = ; i <= n ; i++) {
scanf("%lld" , &a_[i]);
res += a_[i];
}
sort(a_ + , a_ + n + );
LL tmp = (( * Fib(k + ) + Fib(k) + ) * a_[n] + ( * Fib(k) + Fib(k - ) + ) * a_[n - ]) % MOD;
res = (res + tmp) % MOD;
printf("%lld\n" , res);
}
return ;
}

另外记录一个斐波那契的通项公式: ,在HDU1568中会用这个公式。

最新文章

  1. Python函数讲解
  2. Hadoop基础知识
  3. win7 iis7 发布asp.net mvc4.0+EF6.0站点记录
  4. DOS命令大全(经典收藏)
  5. C#基础总结之二循环控制-运算符
  6. 12天学好C语言——记录我的C语言学习之路(Day 1)
  7. margin-top 父div下落
  8. 使用反射+策略模式代替项目中大量的switch case判断
  9. HDU 1232 畅通工程(模板——并查集)
  10. 手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志
  11. Holt-Winters
  12. Linux中利用grep命令如何检索文件内容详解
  13. CSS3知识!
  14. genstr.py
  15. MVC中的Ajax与增删改查(二)
  16. 再谈 tp的 实例化 类 的自动加载
  17. c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换
  18. JavaScript里的Date 对象属性及对象方法--实现简单的日历
  19. First Scrum Meeting (2015/10/18)
  20. SQL Server中常用全局变量介绍

热门文章

  1. Loadrunner监控服务器资源
  2. VS Code 缩小
  3. Note: Differentially Private Access Patterns for Searchable Symmetric Encryption
  4. java进阶——反射(Reflect)
  5. [Django笔记] Apache + mod-wsgi 环境部署所遇到的各种问题总结
  6. Spark TaskScheduler 概述
  7. [Xcode 实际操作]五、使用表格-(3)设置UITableView单元格图标
  8. javascript基础工具清单
  9. Jmeter-线程时间
  10. angularjs 使用angular-sortable-view实现拖拽效果(包括拖动完成后的方法使用)