BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
BZOJ4547 Hdu5171 小奇的集合
Description
有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值。(数据保证这个值为非负数)
Input
第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素。
对于100%的数据,有 n<=105,k<=109,|ai|<=10^5
Output
输出一个整数,表示和的最大值。答案对10000007取模。
Sample Input
2 2
3 6
Sample Output
33
首先我们要分情况讨论
当最大值和次大值都是正数,直接用矩阵快速幂优化就可以了
当最大值是正数,次大值是负数的时候,要先把次大值加成正数再矩阵快速幂
当最大和次大都是负数的时候,可以直接算出答案
然后矩阵快速幂就很常规了,记录一下当前最大值和次大值和sum
然后转移矩阵很简单自己手推一下就好了
#include<bits/stdc++.h>
using namespace std;
#define fu(a,b,c) for(int a=b;a<=c;++a)
#define N 100010
#define INF 0x3f3f3f3f
#define LL long long
#define Mod 10000007
struct Matrix{LL t[][];};
Matrix mul(Matrix a,Matrix b){
Matrix c;
memset(c.t,,sizeof(c.t));
fu(i,,)fu(j,,)fu(k,,)
c.t[i][j]=(c.t[i][j]+a.t[i][k]*b.t[k][j]%Mod+Mod)%Mod;
return c;
}
Matrix fast_pow(Matrix a,LL b){
Matrix ans;
fu(i,,)fu(j,,)ans.t[i][j]=(i==j);
while(b){
if(b&)ans=mul(ans,a);
a=mul(a,a);
b>>=;
}
return ans;
}
int solve(LL max1,LL max2,LL k){
Matrix tmp,ans;
tmp.t[][]=;tmp.t[][]=;tmp.t[][]=;
tmp.t[][]=;tmp.t[][]=;tmp.t[][]=;
tmp.t[][]=;tmp.t[][]=;tmp.t[][]=;
tmp=fast_pow(tmp,k);
ans.t[][]=max1;ans.t[][]=max2;ans.t[][]=;
ans.t[][]=;ans.t[][]=;ans.t[][]=;
ans.t[][]=;ans.t[][]=;ans.t[][]=;
ans=mul(ans,tmp);
return ans.t[][];
}
int main(){
LL n,k,sum=,max1=-INF,max2=-INF;
scanf("%lld%lld",&n,&k);
fu(i,,n){
LL x;scanf("%lld",&x);
sum=(sum+x%Mod+Mod)%Mod;
if(x>max1)max2=max1,max1=x;
else if(x>max2)max2=x;
}
if(max1>&&max2>)printf("%lld",(sum+solve(max1,max2,k)+Mod)%Mod);
else if(max1<&&max2<)printf("%lld",(sum+(max1+max2)*k%Mod+Mod)%Mod);
else{
int cnt=;
while(max2<){
int newv=max1+max2;
if(newv>max1){max2=max1,max1=newv;}
else{max2=newv;}
sum=(sum+newv)%Mod;
cnt++;
if(cnt==k)break;
}
if(cnt==k)printf("%lld",(sum+Mod)%Mod);
else printf("%lld",(sum+solve(max1,max2,k-cnt)+Mod)%Mod);
}
return ;
}
BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】的更多相关文章
- bzoj4547: Hdu5171 小奇的集合(矩阵乘法)
4547: Hdu5171 小奇的集合 题目:传送门 题解: 做一波大佬们的坑...ORZ 不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧) 给个递推柿纸:f[i]=f[i-1]+max1 ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- HDU 1757 矩阵快速幂加速递推
题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...
- 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法
[BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
- AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡
题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有 1, f[0][ ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...
- HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...
随机推荐
- 读取文件并找出年龄最大的N个人-兰亭集市笔试题
C++ code: #include <iostream> #include <fstream> #include <map> #include <strin ...
- 关于IIS权限问题(Selenium WebDriver调用出错记录)
本地VS调试过程中用Selenium WebDriver打开FF浏览器可以正常工作,项目部署至IIS后请求调用浏览器一直提示超时,异常如下: 因为本地调试可以成功,首先排除组件版本问题和浏览器兼容问题 ...
- hdu3706单调队列
很基础的单调队列 #include<map> #include<set> #include<cmath> #include<queue> #includ ...
- 第六天 文件的基本管理和xfs文进系统备份恢复
1.1 Linux系统目录结构,相对路径/绝对路径 1.1.1 Linux系统目录结构 在linux系统中一切都是文件 / 根目录,一切的起点,就像是一个树杈一样,他是所有叉的根 /bin 在单用户模 ...
- IOS-下载动画
就2小时教会你抽丝剥茧CAAnimation核心动画之精美的下载动画 header 设计灵感 设计此效果的作者 Nick; images 开始之前你需要了解的 先上一张CAAnimation层次图: ...
- 使用C++为对象分配与释放内存时的几个好习惯
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近在为公司的项目写内存泄漏定位工具,遇到一些关于C++构造与析构对象的问题,在此记录一下 ...
- configParse模块
一.配置文件简介 在各种程序里面都有配置文件,为了对配置文件进行操作. python中引入了configParse模块进行操作. 配置数值类型: 配置文件中,我们看到的bool型,整数型,在我们操作的 ...
- jquery中prop和attr的区别
jquery中prop和attr的区别 prop: prop(name|properties|key,value|fn) **概述** 获取在匹配的元素集中的第一个元素的属性值. 随着一些内置属性的D ...
- Personal Introduction
专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...
- 简单的cookie盗取
此文需要有一定的javascript\html\php方面的只是作为基础 直接上代码: #用于抓取盗窃来的cookie的php文件,此文件需置于攻击者的服务器上,这里包含了两种写法:Method1和M ...