【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
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个整数表示初始时可重集的元素。
Output
Sample Input
3 6
Sample Output
HINT
Source
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】小奇的集合 矩阵乘法 + 递推的更多相关文章
- bzoj4547: Hdu5171 小奇的集合(矩阵乘法)
4547: Hdu5171 小奇的集合 题目:传送门 题解: 做一波大佬们的坑...ORZ 不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧) 给个递推柿纸:f[i]=f[i-1]+max1 ...
- 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法
[BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...
- bzoj 4547 小奇的集合
Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- [TJOI2019]甲苯先生的字符串——矩阵乘法+递推
题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...
- BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...
- bzoj 4031: 小Z的房间 矩阵树定理
bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...
- Luogu 1962 斐波那契数列(矩阵,递推)
Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...
随机推荐
- php进阶函数
1,对文件的操作,确保多个进程可以同时读写一个文件(flock函数) flock($hamdle,int $operator) operator的取值,LOCK_SH(共享锁定,读取程序),LOCK_ ...
- 在SharePoint列表中使用自增栏
问:sps2010里能不能新建个栏,数字型的,自动加一 答:在SharePoint里,有很多方法可以实现一个自增栏.在这里,我将介绍其中两种方式. 1.计算栏 2.列表项事件接收器 1.采用计算栏来实 ...
- Linux 网络编程详解六(多进程服务器僵尸进程解决方案)
小结:在点对点p2p程序中,服务器端子程序退出,子进程会主动发送信号,关闭父进程,但是这种模式导致服务器只能支持一个客户端连接,本章节中使用新的框架,子进程退出,不主动发送信号关闭父进程,而是父进程安 ...
- TinyFrame升级之七:重构Repository和Unit Of Work
首先,重构的想法来源于以下文章:Correct use of Repository and Unit Of Work patterns in ASP.NET MVC,因为我发现在我的框架中,对Unit ...
- 谈谈软件项目的dependency
说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...
- 中国式IT的项目
这篇文章用来总结一下2013,同时也分享一下我对中国IT项目现状的一些看法. 我先从项目说起.这里的项目主要是指的软件开发项目.我们分别从项目中的甲方和乙方谈谈,看看这两者对于项目.对应IT的认识和观 ...
- unity3d 我的面试经历
昨天在上海的一家公司面试成功了 这是我第一次面试,也是我的第一份工作 先上我的简历给大家参考下吧 个人简历 个人信息: 姓 名: 廖旭升 学 历: 无 民 族: 汉 ...
- hbase-site.xml 配置详解
hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完全正确'的,还要包含文件系统的scheme.例如,要表示hdfs中的'/hbase'目 ...
- CSS基本知识0-命名规范
CSS命名及规范是第一步: 总起:所有名字小写,样式名用-号连接,如.nav-left,CSS使用小写加连接,那么ID就使用大写不加连接,比如UserName,把它和编程的属性对应起来,那么方法就以小 ...
- 从语言到库到框架,再到API,再到标记最后到DSL语言
计算机技术发展很快,而且越来越快,结果也是越来越复杂,那么我们到底怎么搞定复杂性并重用代码? 很明显,这是个大难题.一开始我们要解决计算问题,发展了基本的编程语言. 很快,编程语言不能满足需求,我们需 ...