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 小奇的集合 【矩阵快速幂优化递推】的更多相关文章

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

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

  2. 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 ...

  3. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  4. 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 ...

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

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

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

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

  7. AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡

    题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有    1,  f[0][ ...

  8. CH3401 石头游戏(矩阵快速幂加速递推)

    题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...

  9. HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)

    题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...

随机推荐

  1. LDA学习之beta分布和Dirichlet分布

    ---恢复内容开始--- 今天学习LDA主题模型,看到Beta分布和Dirichlet分布一脸的茫然,这俩玩意怎么来的,再网上查阅了很多资料,当做读书笔记记下来: 先来几个名词: 共轭先验: 在贝叶斯 ...

  2. python的变量,对象的内存地址以及参数传递过程

    作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...

  3. Memcached prepend 命令

    Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 . 语法: prepend 命令的基本语法格式如下: prepend key flags e ...

  4. DLL_Delphi动态调用

    1.动态调用DLL unit formMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  5. 第四章 SSL和Proxy高级选项

    在前一章,我们已经学习了HTTP消息如何通过Burp Proxy进行拦截和处理,本章我们将继续学习HTTPS协议消息的拦截和处理. HTTPS协议是为了数据传输安全的需要,在HTTP原有的基础上,加入 ...

  6. Slasher Flick

    打不死的小强! 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这是一些对你有帮助的资源: Array.slice() Array.splice() 按照提供的第一种方法,代码如下: f ...

  7. pycharm git 提交使用情况

    在IDEA中进行分支切换时,出现如此错误,导致无法正常切换: error: The following untracked working tree files would be overwritte ...

  8. 转载:left join和left semi join的联系和区别

    1.联系 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map ...

  9. DB2 设置最大连接数

    db2 connect to dbname user username using passwd db2 update db cfg using MAXAPPLS number 查看最大连接数 查看D ...

  10. CF 187C Weak Memory 优先队列 难度:2

    http://codeforces.com/problemset/problem/187/C 这道题可以用二分+dfs检测,或者优先队列解 此处用了优先队列解法 从起点出发,维护一个优先队列,内容是p ...