#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#define fi first
#define se second
#define pii pair<int,int>
#define ll long long
#define inf 1<<30
#define eps 1e-8
using namespace std;
const int maxn=100005;
const ll mod=10000007;
int n;
ll k;
int d[maxn];
struct mat
{
ll e[3][3];
};
mat mul(mat p,mat q)
{
mat c;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
c.e[i][j]=0;
for(int k=0;k<3;k++)
{
c.e[i][j]=(c.e[i][j]+p.e[i][k]*q.e[k][j]%mod)%mod;
}
}
}
return c;
}
mat powMat(mat u,ll b)
{
mat s;
memset(s.e,0,sizeof(s));
s.e[0][0]=s.e[1][1]=s.e[2][2]=1;
while(b)
{
if(b&1)
s=mul(s,u);
u=mul(u,u);
b=(b>>1);
}
return s;
}
int main()
{
while(~scanf("%d%I64d",&n,&k)) {
ll sum=0;
for(int i=0;i<n;i++) {
scanf("%d",&d[i]);
sum=(sum+d[i])%mod;
}
sort(d,d+n);
mat m;
m.e[0][0]=1; m.e[0][1]=1; m.e[0][2]=1;
m.e[1][0]=0; m.e[1][1]=1; m.e[1][2]=1;
m.e[2][0]=0; m.e[2][1]=1; m.e[2][2]=0;
mat u=powMat(m,k);
sum=(sum+u.e[0][1]*d[n-1]%mod+u.e[0][2]*d[n-2]%mod)%mod;
printf("%I64d\n",sum);
}
return 0;
}
hdu5171 GTY's birthday gift 矩阵快速幂求斐波那契前n项和,矩阵快速幂模板
最新推荐文章于 2020-03-15 12:28:34 发布