3 2 3 6 2
35

#include <cstring>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int const MOD = 10000007;
struct matrix
{
ll m[3][3];
};
int a[100010];
matrix multiply(matrix x, matrix y) //矩阵乘法
{
matrix tmp;
memset(tmp.m, 0, sizeof(tmp.m));
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(x.m[i][j] == 0)
continue;
for(int k = 0; k < 3; k++)
{
if(y.m[j][k] == 0)
continue;
tmp.m[i][k] += x.m[i][j] * y.m[j][k] % MOD;
tmp.m[i][k] %= MOD;
}
}
}
return tmp;
}
matrix quickmod(matrix a, int n) //矩阵快速幂
{
matrix res;
memset(res.m, 0, sizeof(res.m));
for(int i = 0; i < 3; i++)
res.m[i][i] = 1;
while(n)
{
if(n & 1)
res = multiply(res, a);
n >>= 1;
a = multiply(a, a);
}
return res;
}
int main()
{
int n, k;
while(scanf("%d %d", &n, &k) != EOF)
{
ll sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
sort(a, a + n);
matrix tmp;
tmp.m[0][0] = 1; tmp.m[0][1] = 1; tmp.m[0][2] = 1;
tmp.m[1][0] = 0; tmp.m[1][1] = 1; tmp.m[1][2] = 1;
tmp.m[2][0] = 0; tmp.m[2][1] = 1; tmp.m[2][2] = 0;
tmp = quickmod(tmp, k);
ll ans = (tmp.m[0][0] * sum + tmp.m[0][1] * a[n - 1] + tmp.m[0][2] * a[n - 2]) % MOD;
printf("%lld\n", ans);
}
}HDU 5171 GTY's birthday gift (矩阵快速幂)
原文地址:http://blog.csdn.net/tc_to_top/article/details/43668613