3 2 3 6 2
35
//124MS 1900K
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define mod 10000007
#define ll __int64
using namespace std;
ll s[100007];
struct Matrax
{
ll m[2][2];
}a,per,tmp;
void init()//建立矩阵
{
a.m[0][0]=1;a.m[0][1]=1;
a.m[1][0]=1;a.m[1][1]=0;
per.m[0][0]=1;per.m[0][1]=0;
per.m[1][0]=0;per.m[1][1]=1;
}
Matrax multi(Matrax a,Matrax b)//矩阵相乘
{
Matrax c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
c.m[i][j]=0;
for(int k=0;k<2;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;//比赛的时候漏了%mod
}
return c;
}
Matrax power(ll k)//矩阵快速幂
{
Matrax pp=a,ans=per;
while(k)
{
if(k&1){ans=multi(ans,pp);k--;}
else {k>>=1;pp=multi(pp,pp);}
}
return ans;
}
int main()
{
ll n,k;
while(scanf("%I64d%I64d",&n,&k)!=EOF)
{
init();
ll sum=0,aa,bb,c;
for(int i=0;i<n;i++)
{
scanf("%I64d",&s[i]);
sum=(sum+s[i])%mod;
}
sort(s,s+n);
aa=s[n-2];bb=s[n-1];
Matrax ans1=power(k+2);//求a系数的第n+2项斐波那契数列
Matrax ans2=power(k+3);//求b系数的第n+2项斐波那契数列,因为补了一个1,所以是k+3
ll f=(ans1.m[0][1]-1+mod)%mod;
ll e=(ans2.m[0][1]-2+mod)%mod;//最后多减去补得1
sum=(sum+f*aa)%mod;
sum=(sum+e*bb)%mod;
printf("%I64d\n",sum);
}
return 0;
}
HDU 5171 GTY's birthday gift 矩阵快速幂
原文:http://blog.csdn.net/crescent__moon/article/details/43617703