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 ;
}

最新文章

  1. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
  2. ADOMD连接SSAS和Mondrian,rex的终结者
  3. 画图------Brush
  4. C# ACM poj1003
  5. 将 Excel 数据导入 MySql
  6. net平台下连接池
  7. hibernate 多对多 最佳实践
  8. j2ee面试宝典翻译(1)
  9. Android应用程序组件介绍
  10. spring异常处理
  11. 从async await 报错Unexpected identifier 谈谈对上下文的理解
  12. 学习JVM-GC收集器
  13. [Swift]LeetCode914.一副牌中的X | X of a Kind in a Deck of Cards
  14. charles-Andriod 手机手机抓包乱码
  15. Python第4天
  16. 转:TCP/IP协议(一)网络基础知识
  17. SQLServer常用分页方式
  18. STM32应用实例十四:利用光敏二极管实现光度测量
  19. 浅谈JS的作用域链(一)
  20. Writing and playing with custom Terraform Providers

热门文章

  1. RabbitMQ 的路由模式 Topic模式
  2. 正确使用iOS常量(const)、enum以及宏(#define)
  3. 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录
  4. WPF应用的一些小总结(模板、样式,上下文)
  5. Android----- MD5加密(登录注册得到与IOS相同的加密值,并且解决两个平台汉字加密不相同问题)
  6. 学习 nginx (持续更新)
  7. 2018.2.2IDEA 项目层级问题
  8. HDU5137-最短路-删点
  9. Ubuntu相关命令
  10. day5-import机制详述