4547: Hdu5171 小奇的集合

Time Limit: 2 Sec  Memory Limit: 256 MB
Submit: 175  Solved: 85
[Submit][Status][Discuss]

Description

有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大

值。(数据保证这个值为非负数)

Input

第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素。

对于100%的数据,有 n<=10^5,k<=10^9,|ai|<=10^5

Output

输出一个整数,表示和的最大值。答案对10000007取模。

Sample Input

2 2
3 6

Sample Output

33

HINT

Source

By Hzwer

Solution

很显然,每次操作都是取最大和次大相加,然后如此下去

如此这样发现,显然是一个fib前缀和的问题,那么显然可以递推

优化这个递推,显然可以矩阵乘法

$\begin{bmatrix}S[max]&  S[cmax]& Sum \end{bmatrix}*(\begin{bmatrix} 1& &1& &0\\ 1& &0& &0\\ 1& &1& &1 \end{bmatrix})^{K}$

其中S[max]表示最大,S[cmax]表示次大

如果初始的次大<0先不断累加最大,到>=0为止,然后进行上述处理

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 100010
#define L 4
#define sz 3
#define p 10000007
int N,K;
int S[MAXN];
int sum;
struct MatNode{int a[L][L]; MatNode() {memset(a,,sizeof(a));}}A,D;
MatNode MatMul(MatNode X,MatNode Y)
{
MatNode C;
for (int k=; k<=sz; k++)
for (int i=; i<=sz; i++)
for (int j=; j<=sz; j++)
if (X.a[i][k] && Y.a[k][j])
(C.a[i][j]+=(long long)X.a[i][k]*Y.a[k][j]%p)%=p;
return C;
}
MatNode MatPow(MatNode x,int y)
{
MatNode re;
for (int i=; i<=sz; i++) re.a[i][i]=;
for (int i=y; i; i>>=,x=MatMul(x,x))
if (i&) re=MatMul(re,x);
return re;
}
void BuildMat()
{
A.a[][]=; A.a[][]=; A.a[][]=;
A.a[][]=; A.a[][]=; A.a[][]=;
A.a[][]=; A.a[][]=; A.a[][]=;
D.a[][]=S[]; D.a[][]=S[]; D.a[][]=sum;
}
bool cmp(int a,int b) {return a>b;}
int main()
{
N=read(),K=read();
for (int i=; i<=N; i++) S[i]=read(),sum+=S[i],sum=(sum+p)%p;
sort(S+,S+N+,cmp);
while (S[]< && K>)
{
S[]=(S[]+S[])%p; K--;
sum+=S[]; sum=(sum+p)%p;
}
BuildMat();
D=MatMul(MatPow(A,K),D);
int ans=(D.a[][]+p)%p;
printf("%d\n",ans);
return ;
}

【BZOJ-4547】小奇的集合 矩阵乘法 + 递推的更多相关文章

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

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

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

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

  3. bzoj 4547 小奇的集合

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

  4. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

    题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .

  5. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  6. [TJOI2019]甲苯先生的字符串——矩阵乘法+递推

    题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...

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

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

  8. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  9. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

随机推荐

  1. Sonatype Nexus Maven仓库搭建和管理

    安装 1. 从 http://www.sonatype.org/nexus/ 下载最新的 Nexus 压缩包, 现在已经不提供war包的下载 2. 解压到服务器目录, 例如我是放到/opt/nexus ...

  2. 升级nodejs版本

    node有一个模块叫n,是专门用来管理node.js的版本的. 首先安装n模块: npm install -g n 第二步: 升级node.js到最新稳定版 n stable n后面也可以跟随版本号比 ...

  3. xhEditor用法

    xhEditor是一个基于jQuery开发的简单迷你并且高效的在线可视化HTML编辑器,而且兼容很多浏览器,所以就选它了,具体使用如下: 1 .下载xhEditor 最新版本 下载地址:http:// ...

  4. Core Web API上使用Swagger提供API文档

    在ASP.NET Core Web API上使用Swagger提供API文档   我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的AP ...

  5. stringstream的用法【转】

    [本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...

  6. 关于printf函数的所思所想

    缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题.涉及网上资料将会标明出处. 关于printf函数的所思所想 * printf的定义 printf( ...

  7. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  8. rhel7修改网卡命名规则

    1步:当安装完红帽RHEL7系统安装完成,您的网卡命名是这样的. 第2步:请编辑网卡的配置文件 将”/etc/sysconfig/network-scripts/ifcfg-eno16777736“的 ...

  9. python环境搭建-Pycharm 调整字体大小

  10. 用centos光盘安装RPM包的方法

    1.在虚拟机光盘选项中设置连接路径为centos安装光盘. 2.将光盘挂载到本地目录. #新建一个文件夹 mkdir cdrom #把光盘挂载到cdrom目录下 mount /dev/cdrom cd ...