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 ...
随机推荐
- LDA学习之beta分布和Dirichlet分布
---恢复内容开始--- 今天学习LDA主题模型,看到Beta分布和Dirichlet分布一脸的茫然,这俩玩意怎么来的,再网上查阅了很多资料,当做读书笔记记下来: 先来几个名词: 共轭先验: 在贝叶斯 ...
- python的变量,对象的内存地址以及参数传递过程
作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...
- Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 . 语法: prepend 命令的基本语法格式如下: prepend key flags e ...
- DLL_Delphi动态调用
1.动态调用DLL unit formMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...
- 第四章 SSL和Proxy高级选项
在前一章,我们已经学习了HTTP消息如何通过Burp Proxy进行拦截和处理,本章我们将继续学习HTTPS协议消息的拦截和处理. HTTPS协议是为了数据传输安全的需要,在HTTP原有的基础上,加入 ...
- Slasher Flick
打不死的小强! 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这是一些对你有帮助的资源: Array.slice() Array.splice() 按照提供的第一种方法,代码如下: f ...
- pycharm git 提交使用情况
在IDEA中进行分支切换时,出现如此错误,导致无法正常切换: error: The following untracked working tree files would be overwritte ...
- 转载:left join和left semi join的联系和区别
1.联系 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map ...
- DB2 设置最大连接数
db2 connect to dbname user username using passwd db2 update db cfg using MAXAPPLS number 查看最大连接数 查看D ...
- CF 187C Weak Memory 优先队列 难度:2
http://codeforces.com/problemset/problem/187/C 这道题可以用二分+dfs检测,或者优先队列解 此处用了优先队列解法 从起点出发,维护一个优先队列,内容是p ...