bzoj4547: Hdu5171 小奇的集合(矩阵乘法)
4547: Hdu5171 小奇的集合
题目:传送门
题解:
做一波大佬们的坑...ORZ
不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧)
给个递推柿纸:f[i]=f[i-1]+max1+max2
因为题目保证答案非负,那么一般情况下,肯定是将max1+max2加入原数列啊
兴高采烈的一顿乱水,nice!一WA
md被CC无情嘲笑...
再看一波题目...abs(a[i])<=10^5???
有负数?!
woc那如果max2<0那么我不就GG???
好的又是一顿乱水,直接暴力将max2变为正数...
nice!二WA!
对拍!mmp。。。
一千年过去了..."仍无差异"
%一发企鹅,发现他的sum加的时候先加了一个mod!?
woc求和时加过了mod之后来个很小的负数我又挂了...然后小心翼翼的改了再提交
终于...A了(毒瘤!!!)
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 10000007
using namespace std;
typedef long long LL;
struct node
{
LL m[][];
node(){memset(m,,sizeof(m));}
}A,B,C,pre;
LL n,k,tt,max1,max2;
LL a[];
node multi(node a,node b)
{
node c;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
return c;
}
node sol(LL b)
{
node ans;
for(int i=;i<=;i++)ans.m[i][i]=;
while(b)
{
if(b%==)ans=multi(ans,pre);
pre=multi(pre,pre);b/=;
}
return ans;
}
int main()
{
freopen("4547.in","r",stdin);
freopen("ans.out","w",stdout);
scanf("%lld%lld",&n,&k);LL sum=;
for(int i=;i<=n;i++)scanf("%lld",&a[i]),sum=(sum+a[i]+mod)%mod;
sort(a+,a+n+);max1=a[n];max2=a[n-];
if(max2< && max1>)
{
tt=;
while(max2<)
{
max2+=max1;
sum=(sum+max2+mod)%mod;
tt++;
}
if(max2>max1)swap(max2,max1);
}
pre.m[][]=pre.m[][]=pre.m[][]=pre.m[][]=pre.m[][]=pre.m[][]=;
A=sol(k-tt);
B.m[][]=sum,B.m[][]=max1,B.m[][]=max2;
C=multi(A,B);
printf("%lld\n",C.m[][]%mod);
return ;
}
bzoj4547: Hdu5171 小奇的集合(矩阵乘法)的更多相关文章
- 【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 ...
- BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...
- BZOJ4547 Hdu5171 小奇的集合
题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...
- BZOJ 4547: Hdu5171 小奇的集合
Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是 ...
- bzoj4547 小奇的集合
当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即 ...
- bzoj 4547 小奇的集合
Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...
- [HDU517] 小奇的集合
题目链接 显然有贪心每次选择最大的两个数来做. 于是暴力地把最大的两个数调整到非负(暴力次数不超过1e5),接下来使用矩阵乘法即可. \[ \begin{pmatrix} B'\\S'\\T' \en ...
- 【BZOJ 4547】【HDU 5157】小奇的集合
http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS: ...
随机推荐
- Android图文混排-实现EditText图文混合插入上传
前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中.须要支持文本和图片的混合插入,下图演示输入的演示样例: 当会议 ...
- BZOJ3170: [Tjoi2013]松鼠聚会
[传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...
- 【BZOJ 2463】 谁能赢呢?
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2463 [算法] n为偶数时必胜,否则必败 [代码] #include<bits ...
- 客户现场调试(连接oracle数据库)
1.System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本 http://blog.csdn.net/yucaoye/article/details/ ...
- caffe.bin caffe的框架
最近打算看一看caffe实现的源码,因为发现好多工作都是基于改动网络来实现自己的的目的.比如变更目标函数以及网络结构,以实现图片风格转化或者达到更好的效果. 深度学习框架 https://mp.wei ...
- 利用IOC—— Castle进行对象映射,以及结合Nhibernate访问数据库
相信很多人对IOC这个概念并不陌生,简而言之其核心就是利用反射来创建对象来实现解耦. 具体这么做解耦的好处是什么,因为鄙人做的项目还不多,所以还没体会到. 但好的项目大概是这样的 就是实现“高内聚,低 ...
- Java基础——StringBuffer和StringBuilder
本节讲述2个字符串容器的区别 StringBuffer和StringBuilder区别: 1.相同点 两者都是容器(可变的字符序列),都可以对字符串进行基本的“增删改查”操作. 2.不同点 Strin ...
- DataTables入门
转载 https://blog.csdn.net/gfd54gd5f46/article/details/65938189
- ZBrush中标准几何体与Polymesh
通过对ZBrush的学习,相信您已经对这款软件有了一定的了解,文本我们主要学习ZBrush®的3D物体标准几何体的特性和使用方法.在ZBrush中只有Polymesh(多边形网格)物体才能使用雕刻笔刷 ...
- ZBrush中Layer层笔刷介绍
本文我们来介绍ZBrush®中的Layer层笔刷,该笔刷是一种类似梯田效果的笔刷,常用来制作鳞甲和花纹图腾.他还可以用一个固定的数值抬高或降低模型的表面,当笔刷在重合时,笔画重叠部分不会再次位移,这使 ...