Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 408 Accepted Submission(s): 154
3 2 3 6 2
35
#include<iostream> #include<cstdio> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<cstring> #include<algorithm> #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rev(i,a,b) for(int i=(a);i>=(b);i--) #define clr(a,x) memset(a,x,sizeof a) #define inf 0x3f3f3f3f typedef long long LL; using namespace std; #define pa pair<int,int> #define pi 3.1415926535897932384626433832795028841971 #define MOD 10000007 #define maxn 200000 using namespace std; long long y; struct mat { long long m[3][3]; mat(){memset(m,0,sizeof(m));} }; mat operator * (mat a,mat b) { mat ans; for(int i=0;i<=2;i++) for(int j=0;j<=2;j++) for(int k=0;k<=2;k++) ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%MOD; return ans; } mat pow(mat a,long long n) { if(n==0){ memset(a.m,0,sizeof(a)); for(int i=0;i<=2;i++)a.m[i][i]=1; } if(n==1)return a; if(n&1)return a*pow(a,n-1); else{ mat u=pow(a,n>>1); return u*u; } } long long a[maxn]; int main() { long long x; while(scanf("%I64d%I64d",&x,&y)!=EOF) { long long sum=0; for(int i=1;i<=x;i++) scanf("%I64d",&a[i]),sum+=a[i]; sort(a+1,a+1+x); long long c=a[x],d=a[x-1]; mat u,v; u.m[0][0]=u.m[0][1]=u.m[0][2]=u.m[1][1]=u.m[1][2]=u.m[2][1]=1; v.m[0][0]=sum,v.m[1][0]=c,v.m[2][0]=d; u=pow(u,y); v=u*v; printf("%I64d\n",v.m[0][0]%MOD); } return 0; }