hdu5171---GTY's birthday gift

Problem Description

FFZ’s birthday is coming. GTY wants to give a gift to ZZF. He asked his gay friends what he should give to ZZF. One of them said, ‘Nothing is more interesting than a number multiset.’ So GTY decided to make a multiset for ZZF. Multiset can contain elements with same values. Because GTY wants to finish the gift as soon as possible, he will use JURUO magic. It allows him to choose two numbers a and b(a,b∈S), and add a+b to the multiset. GTY can use the magic for k times, and he wants the sum of the multiset is maximum, because the larger the sum is, the happier FFZ will be. You need to help him calculate the maximum sum of the multiset.

Input

Multi test cases (about 3) . The first line contains two integers n and k (2≤n≤100000,1≤k≤1000000000). The second line contains n elements ai (1≤ai≤100000)separated by spaces , indicating the multiset S .

Output

For each case , print the maximum sum of the multiset (mod 10000007).

Sample Input

3 2 3 6 2

Sample Output

35

Source

BestCoder Round #29

Recommend

hujie | We have carefully selected several similar problems for you: 5173 5172 5169 5168 5165

设现在拿出的数为a和b,且a >= b,则下一次拿出的数为 a + b, a

存在递推关系,得到递推矩阵后,快速幂求解即可,复杂度O(logn)

/*************************************************************************
    > File Name: hdu5171.cpp
    > Author: ALex
    > Mail: [email protected]
    > Created Time: 2015年02月14日 星期六 10时48分07秒
 ************************************************************************/

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
const int mod = 10000007;

struct MARTIX
{
    LL mat[3][3];
};

MARTIX mutiple (MARTIX A, MARTIX B)
{
    MARTIX C;
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            C.mat[i][j] = 0;
            for (int k = 0; k < 3; ++k)
            {
                C.mat[i][j] += A.mat[i][k] * B.mat[k][j];
                C.mat[i][j] %= mod;
            }
        }
    }
    return C;
}

void POW (LL a, LL b, LL s, int k)
{
    MARTIX ret, ans, bse;
    ret.mat[0][0] = ret.mat[0][1] = ret.mat[0][2] = 1;
    ret.mat[1][0] = ret.mat[2][0] = ret.mat[2][2] = 0;
    ret.mat[1][1] = ret.mat[1][2] = ret.mat[2][1] = 1;
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            ans.mat[i][j] = (i == j ? 1 : 0);
            bse.mat[i][j] = 0;
        }
    }
    bse.mat[0][0] = s;
    bse.mat[1][0] = a;
    bse.mat[2][0] = b;
    while (k)
    {
        if (k & 1)
        {
            ans = mutiple (ans, ret);
        }
        k >>= 1;
        ret = mutiple (ret, ret);
    }
    ans = mutiple (ans, bse);
    printf("%lld\n", ans.mat[0][0]);
}

int main ()
{
    int n, k;
    while (~scanf("%d%d", &n, &k))
    {
        LL m1 = -inf, m2 = -inf;
        LL s = 0;
        LL t;
        for (int i = 1; i <= n; ++i)
        {
            scanf("%lld", &t);
            s += t;
            if (m1 < t)
            {
                m2 = m1;
                m1 = t;
            }
            else if (m2 < t)
            {
                m2 = t;
            }
        }
        POW (m1, m2, s, k);
    }
    return 0;
}

hdu5171---GTY's birthday gift

时间: 2024-10-01 07:37:57

hdu5171---GTY's birthday gift的相关文章

HDU5171 GTY&#39;s birthday gift(矩阵快速幂)

Problem Description FFZ's birthday is coming. GTY wants to give a gift to ZZF. He asked his gay friends what he should give to ZZF. One of them said, 'Nothing is more interesting than a number multiset.' So GTY decided to make a multiset for ZZF. Mul

【Best Coder】#29 B GTY&#39;s birthday gift(快速幂|mod的时候记得负!)

题目大意:查看相关场次即可看到. 思路:推公式的题目,可以用快速幂加公式快速解决,也可以用二进制拆分运算的方法加快速度. 需要注意的一点在于:今后在mod之后有涉及到运算的都要加上一个mod之后再mod,或者统一都加一个mod 顺便复习一下二进制拆分的方法!! 二进制拆分的做法AC代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cstdio> usin

hdu 5171 GTY&#39;s birthday gift(数学,矩阵快速幂)

题意: 开始时集合中有n个数. 现在要进行k次操作. 每次操作:从集合中挑最大的两个数a,b进行相加,得到的数添加进集合中. 以此反复k次. 问最后集合中所有数的和是多少. (2≤n≤100000,1≤k≤1000000000) 思路: 写出来发现是要求Fibonaci的前n个数的和. Fibonaci是用矩阵快速幂求的,这个也可以. [Sn,Fn,Fn-1]=[某个矩阵]*[Sn-1,Fn-1,Fn-2] [S2,F2,F1]=[2,1,1] 然后写,,, 这个代码有些繁琐,应该把矩阵操作单独

HDU 5171 GTY&#39;s birthday gift 矩阵快速幂

点击打开链接 GTY's birthday gift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 225    Accepted Submission(s): 78 Problem Description FFZ's birthday is coming. GTY wants to give a gift to ZZF. He as

1002 GTY&#39;s birthday gift

GTY's birthday gift                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)                                                                            

hdu 5171 GTY&#39;s birthday gift (BestCoder Round #29)

GTY's birthday gift                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 209    Accepted Submission(s): 71 Problem Description F

HDU 5171 GTY&#39;s birthday gift(矩阵快速幂 )

HDU 5171 GTY's birthday gift ( 矩阵快速幂裸题目 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAX_SIZE 3 #define MOD 10000007 #define clr( a, b ) memset( a, b, sizeof(a) ) typedef long long LL; struct M

GTY&#39;s birthday gift【矩阵快速幂】

题目大意:GTY的朋友ZZF的生日要来了,GTY问他的基友送什么礼物比较好,他的一个基友说送一个可重集吧!于是GTY找到了一个可重集S,GTY能使用神犇魔法k次,每次可以向可重集中加入一个数 a+b ,现在GTY想最大化可重集的和,这个工作就交给你了. 注:可重集是指可以包含多个相同元素的集合 思路:这题 呵呵呵,太伤心 不想写思路 #include<iostream>#include<cstdio>#include <math.h>#include<algori

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8

hdu5171(矩阵快速幂)

传送门:GTY's birthday gift 题意:GTY的朋友ZZF的生日要来了,GTY问他的基友送什么礼物比较好,他的一个基友说送一个可重集吧!于是GTY找到了一个可重集S,GTY能使用神犇魔法k次,每次可以向可重集中加入一个数 a+b(a,b∈S),现在GTY想最大化可重集的和,这个工作就交给你了. 注:可重集是指可以包含多个相同元素的集合 分析:想要和最大,那么每次必定从集合里面拿出最大的两个出来相加,然后k次后面就类似斐波那契数列了. 由斐波那契数列公式知:Fn=Fn-1+Fn-2,