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 小奇的集合(矩阵乘法)的更多相关文章

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

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

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

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

  3. BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】

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

  4. BZOJ4547 Hdu5171 小奇的集合

    题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...

  5. BZOJ 4547: Hdu5171 小奇的集合

    Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是 ...

  6. bzoj4547 小奇的集合

    当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即 ...

  7. bzoj 4547 小奇的集合

    Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...

  8. [HDU517] 小奇的集合

    题目链接 显然有贪心每次选择最大的两个数来做. 于是暴力地把最大的两个数调整到非负(暴力次数不超过1e5),接下来使用矩阵乘法即可. \[ \begin{pmatrix} B'\\S'\\T' \en ...

  9. 【BZOJ 4547】【HDU 5157】小奇的集合

    http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS: ...

随机推荐

  1. DNS递归查询和迭代查询的差别

    转载地址:http://blog.csdn.net/wuchuanpingstone/article/details/6720723 递归查询和迭代查询的差别 (1)递归查询 递归查询是一种DNS s ...

  2. Linux学习之基本介绍

    技术不分年龄高低,只分水平高低. 搞技术25k以下是不看天赋的,25k以上是要看天赋的. 1U服务器,2U服务器,刀片服务器.程序都是运行在服务器上的. 榜样的力量是无穷的.--MK. 汇编语言跟硬件 ...

  3. DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat

    github上有一堆的工具:https://github.com/search?utf8=%E2%9C%93&q=DNS+tunnel+&type= DNS隧道大检阅 研究了一天的DN ...

  4. hdoj--2803--The MAX(水题)

    The MAX Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. 最小生成树基础 (Kruskal)

    最小生成树 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  6. [转]Linux常用命令学习

    转自 https://www.cnblogs.com/gaojun/p/3359355.html 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文 ...

  7. UICollectionView的注册

    UICollectionView的dataSource中的item的注册 itme的注册和tableview中cell的创建是不同的 cell的创建是在cell中 而itme的注册是在viewDidL ...

  8. flask-alembic数据迁移工具

    alembic是用来做ORM模型与数据库的迁移与映射.alembic使用方式跟git有点类似,表现在两个方面, 第一,alemibi的所有命令都是以alembic开头: 第二,alembic的迁移文件 ...

  9. 阿里云Maven中央仓库配置

    方式一:统一配置 在maven安装目录/conf下的settings.xml 文件里配置mirrors的子节点,添加如下mirror <mirror> <id>alimaven ...

  10. 用replaceState操作路由的方法封装

    export class Router { ReplaceState(url, data) { var query = this.Generate(data); window.history.repl ...