当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即可。

  代码

  

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200010
#define P 10000007
using namespace std;
typedef long long ll;
int n,k,i,j,t1,t2;
int a[N];
long long u,v,w,sum;
struct g{
long long v[][];
void clear()
{
memset(v,,sizeof(v));
}
}m,o;
g operator *(g a,g b)
{
g c;c.clear();
int i,j,k;
for (i=;i<=;i++)
for (j=;j<=;j++)
for (k=;k<=;k++)
c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%P;
return c;
}
g ksm(int x)
{
g ans;
if (x==)
return o;
ans=ksm(x/);
ans=ans*ans;
if (x%)
ans=ans*o;
return ans;
}
int main()
{
a[]=-;
scanf("%d%d",&n,&k);
for(i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum=(sum+a[i])%P;
if (a[i]>a[t1]) t1=i;
}
for (i=;i<=n;i++)
if ((i!=t1)&&(a[i]>a[t2])) t2=i;
u=a[t1];v=a[t2];
if ((u<=)&&(v<=))
{
sum=(sum+(u+v)*k)%P;
}
else
{
while (((u<=)||(v<=))&&(k))
{
w=u+v;sum=(w+sum)%P;
u=max(u,v);v=w;k--;
}
if (u>v)
{
w=v;v=u;u=w;
}
o.clear();
o.v[][]=o.v[][]=o.v[][]=;
o.v[][]=o.v[][]=o.v[][]=;
if (k) m=ksm(k);
/*
for (i=0;i<=2;i++)
{
for (j=0;j<=2;j++)
printf("%d ",m.v[i][j]);
printf("\n");
}
*/
sum=(sum+u*m.v[][]+v*m.v[][])%P;
}
printf("%lld\n",sum);
}
/*
0 1 0
1 1 0
1 1 1
*/

bzoj4547 小奇的集合的更多相关文章

  1. BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】

    BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...

  2. 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法

    [BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...

  3. 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推

    4547: Hdu5171 小奇的集合 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 175  Solved: 85[Submit][Status][D ...

  4. bzoj4547: Hdu5171 小奇的集合(矩阵乘法)

    4547: Hdu5171 小奇的集合 题目:传送门 题解: 做一波大佬们的坑...ORZ 不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧) 给个递推柿纸:f[i]=f[i-1]+max1 ...

  5. BZOJ4547 Hdu5171 小奇的集合

    题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...

  6. bzoj 4547 小奇的集合

    Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...

  7. 【BZOJ 4547】【HDU 5157】小奇的集合

    http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS: ...

  8. BZOJ 4547: Hdu5171 小奇的集合

    Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是 ...

  9. [HDU517] 小奇的集合

    题目链接 显然有贪心每次选择最大的两个数来做. 于是暴力地把最大的两个数调整到非负(暴力次数不超过1e5),接下来使用矩阵乘法即可. \[ \begin{pmatrix} B'\\S'\\T' \en ...

随机推荐

  1. (转) java 简单工厂模式(实现一个计算器)

    package com.simpleFactory; /** * 运算类 * @author Administrator * */ public class Operation { private d ...

  2. 低功耗蓝牙4.0BLE编程-nrf51822开发(9)

    Android 4.3以后的系统自动支持蓝牙4.0规范的低功耗蓝牙(BLE).在android4.3之前,蓝牙4.0支持是由手机厂家加入支持的,接口各异,导致开发一个支持蓝牙4.0程序支持市面上的手机 ...

  3. wampserver

  4. jQuery.mobile.activePage获取当点活动的page

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. Redis学习笔记(6)-SortedSet

    package cn.com; import java.util.HashMap; import java.util.Map; import java.util.Set; import redis.c ...

  6. 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。

    一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现.

  7. php---apache的A/B测试

    A/B测试 A/B测试是一种新兴的网页优化方法,可以用于增加转化率注册率等网页指标..A/B测试的目的在于通过科学的实验设计.采样样本代表性.流量分割与小流量测试等方式来获得具有代表性的实验结论,并确 ...

  8. Array原型链添加“遍历”方法

    <script> //1.在我们之前的项目里向原型链中集成方法时大多代码分析不严密,有时间我在这里会做详细分析; Array.prototype.each = function(fn) { ...

  9. 一本很不错的书----DOOM启示录

    强推,所有玩游戏的和做游戏的热爱游戏的都应该看看. 摘录了一些话. 盖茨不明白,为什么啊为什么,为什么一个麦斯奎特的小公司,居然能从他手下挖走迈克尔·亚伯拉什,而且仅仅凭借几个游戏就胜过了自己的软件帝 ...

  10. c#导出excel(转)

    C#导出Excel文件实例代码 2010-08-03 14:10:36|  分类: 软件编程 |  标签:excel  c#导出excel   |字号大中小 订阅 /// <summary> ...