HDU 5171 GTYs birthday gift 矩阵快速幂

//124MS1900K#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#define mod 10000007#define ll __int64using 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+3ll f=(ans1.m[0][1]-1+mod)%mod;ll e=(ans2.m[0][1]-2+mod)%mod;//最后多减去补得1sum=(sum+f*aa)%mod;sum=(sum+e*bb)%mod;printf("%I64d\n",sum);}return 0;}

,而现在我喜欢深邃的夜空,包容一切的黑暗和隐忍,留下眼泪也没人看见。

HDU 5171 GTYs birthday gift 矩阵快速幂

相关文章:

你感兴趣的文章:

标签云: